From 2ef7b8b3b1f7af8226381cb9dfd6f31dcae022e6 Mon Sep 17 00:00:00 2001 From: ssongliu <songlius11@163.com> Date: Fri, 19 Jul 2024 19:04:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20core=20=E5=8A=9F=E8=83=BD=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/app/api/v1/auth.go | 186 + core/app/api/v1/entry.go | 16 + core/app/api/v1/helper/helper.go | 86 + core/app/api/v1/logs.go | 83 + core/app/api/v1/setting.go | 344 + core/app/api/v1/upgrade.go | 67 + core/app/dto/auth.go | 40 + core/app/dto/common_req.go | 54 + core/app/dto/common_res.go | 16 + core/app/dto/logs.go | 50 + core/app/dto/setting.go | 220 + core/app/model/base.go | 9 + core/app/model/logs.go | 31 + core/app/model/setting.go | 8 + core/app/repo/common.go | 128 + core/app/repo/logs.go | 101 + core/app/repo/setting.go | 59 + core/app/service/auth.go | 196 + core/app/service/entry.go | 9 + core/app/service/logs.go | 128 + core/app/service/setting.go | 403 + core/app/service/upgrade.go | 352 + core/buserr/errors.go | 55 + core/buserr/multi_err.go | 23 + core/cmd/server/cmd/listen-ip.go | 60 + core/cmd/server/cmd/reset.go | 102 + core/cmd/server/cmd/restore.go | 122 + core/cmd/server/cmd/root.go | 80 + core/cmd/server/cmd/update.go | 240 + core/cmd/server/cmd/user-info.go | 56 + core/cmd/server/cmd/version.go | 40 + core/cmd/server/conf/app.yaml | 17 + core/cmd/server/conf/conf.go | 6 + core/cmd/server/docs/docs.go | 23464 +++++++++++++++++++++++ core/cmd/server/docs/swagger.go | 6 + core/cmd/server/docs/swagger.json | 23441 ++++++++++++++++++++++ core/cmd/server/docs/swagger.yaml | 15166 +++++++++++++++ core/cmd/server/web/favicon.png | Bin 0 -> 9330 bytes core/cmd/server/web/web.go | 15 + core/configs/config.go | 6 + core/configs/log.go | 9 + core/configs/system.go | 25 + core/constant/common.go | 20 + core/constant/dir.go | 20 + core/constant/errs.go | 164 + core/constant/session.go | 13 + core/constant/status.go | 6 + core/global/global.go | 26 + core/go.mod | 105 + core/go.sum | 393 + core/i18n/i18n.go | 98 + core/i18n/lang/en.yaml | 198 + core/i18n/lang/zh-Hant.yaml | 200 + core/i18n/lang/zh.yaml | 202 + core/init/cache/badger_db/badger_db.go | 79 + core/init/cache/cache.go | 56 + core/init/db/db.go | 58 + core/init/hook/hook.go | 82 + core/init/log/log.go | 67 + core/init/migration/migrate.go | 20 + core/init/migration/migrations/init.go | 123 + core/init/router/router.go | 76 + core/init/session/psession/psession.go | 47 + core/init/session/session.go | 11 + core/init/validator/validator.go | 65 + core/init/viper/viper.go | 122 + core/log/config.go | 41 + core/log/dup_write_darwin.go | 20 + core/log/dup_write_linux.go | 20 + core/log/dup_write_windows.go | 9 + core/log/manager.go | 53 + core/log/writer.go | 250 + core/main.go | 28 + core/middleware/bind_domain.go | 41 + core/middleware/demo_handle.go | 57 + core/middleware/helper.go | 32 + core/middleware/ip_limit.go | 67 + core/middleware/jwt.go | 28 + core/middleware/loading.go | 24 + core/middleware/operation.go | 216 + core/middleware/password_expired.go | 45 + core/middleware/session.go | 38 + core/router/common.go | 9 + core/router/entry.go | 9 + core/router/ro_base.go | 22 + core/router/ro_log.go | 21 + core/router/ro_router.go | 7 + core/router/ro_setting.go | 42 + core/server/init.go | 6 + core/server/server.go | 88 + core/utils/captcha/captcha.go | 45 + core/utils/cmd/cmd.go | 76 + core/utils/common/common.go | 96 + core/utils/copier/copier.go | 18 + core/utils/encrypt/encrypt.go | 104 + core/utils/files/files.go | 139 + core/utils/http/http.go | 97 + core/utils/jwt/jwt.go | 69 + core/utils/mfa/mfa.go | 46 + 99 files changed, 69633 insertions(+) create mode 100644 core/app/api/v1/auth.go create mode 100644 core/app/api/v1/entry.go create mode 100644 core/app/api/v1/helper/helper.go create mode 100644 core/app/api/v1/logs.go create mode 100644 core/app/api/v1/setting.go create mode 100644 core/app/api/v1/upgrade.go create mode 100644 core/app/dto/auth.go create mode 100644 core/app/dto/common_req.go create mode 100644 core/app/dto/common_res.go create mode 100644 core/app/dto/logs.go create mode 100644 core/app/dto/setting.go create mode 100644 core/app/model/base.go create mode 100644 core/app/model/logs.go create mode 100644 core/app/model/setting.go create mode 100644 core/app/repo/common.go create mode 100644 core/app/repo/logs.go create mode 100644 core/app/repo/setting.go create mode 100644 core/app/service/auth.go create mode 100644 core/app/service/entry.go create mode 100644 core/app/service/logs.go create mode 100644 core/app/service/setting.go create mode 100644 core/app/service/upgrade.go create mode 100644 core/buserr/errors.go create mode 100644 core/buserr/multi_err.go create mode 100644 core/cmd/server/cmd/listen-ip.go create mode 100644 core/cmd/server/cmd/reset.go create mode 100644 core/cmd/server/cmd/restore.go create mode 100644 core/cmd/server/cmd/root.go create mode 100644 core/cmd/server/cmd/update.go create mode 100644 core/cmd/server/cmd/user-info.go create mode 100644 core/cmd/server/cmd/version.go create mode 100644 core/cmd/server/conf/app.yaml create mode 100644 core/cmd/server/conf/conf.go create mode 100644 core/cmd/server/docs/docs.go create mode 100644 core/cmd/server/docs/swagger.go create mode 100644 core/cmd/server/docs/swagger.json create mode 100644 core/cmd/server/docs/swagger.yaml create mode 100644 core/cmd/server/web/favicon.png create mode 100644 core/cmd/server/web/web.go create mode 100644 core/configs/config.go create mode 100644 core/configs/log.go create mode 100644 core/configs/system.go create mode 100644 core/constant/common.go create mode 100644 core/constant/dir.go create mode 100644 core/constant/errs.go create mode 100644 core/constant/session.go create mode 100644 core/constant/status.go create mode 100644 core/global/global.go create mode 100644 core/go.mod create mode 100644 core/go.sum create mode 100644 core/i18n/i18n.go create mode 100644 core/i18n/lang/en.yaml create mode 100644 core/i18n/lang/zh-Hant.yaml create mode 100644 core/i18n/lang/zh.yaml create mode 100644 core/init/cache/badger_db/badger_db.go create mode 100644 core/init/cache/cache.go create mode 100644 core/init/db/db.go create mode 100644 core/init/hook/hook.go create mode 100644 core/init/log/log.go create mode 100644 core/init/migration/migrate.go create mode 100644 core/init/migration/migrations/init.go create mode 100644 core/init/router/router.go create mode 100644 core/init/session/psession/psession.go create mode 100644 core/init/session/session.go create mode 100644 core/init/validator/validator.go create mode 100644 core/init/viper/viper.go create mode 100644 core/log/config.go create mode 100644 core/log/dup_write_darwin.go create mode 100644 core/log/dup_write_linux.go create mode 100644 core/log/dup_write_windows.go create mode 100644 core/log/manager.go create mode 100644 core/log/writer.go create mode 100644 core/main.go create mode 100644 core/middleware/bind_domain.go create mode 100644 core/middleware/demo_handle.go create mode 100644 core/middleware/helper.go create mode 100644 core/middleware/ip_limit.go create mode 100644 core/middleware/jwt.go create mode 100644 core/middleware/loading.go create mode 100644 core/middleware/operation.go create mode 100644 core/middleware/password_expired.go create mode 100644 core/middleware/session.go create mode 100644 core/router/common.go create mode 100644 core/router/entry.go create mode 100644 core/router/ro_base.go create mode 100644 core/router/ro_log.go create mode 100644 core/router/ro_router.go create mode 100644 core/router/ro_setting.go create mode 100644 core/server/init.go create mode 100644 core/server/server.go create mode 100644 core/utils/captcha/captcha.go create mode 100644 core/utils/cmd/cmd.go create mode 100644 core/utils/common/common.go create mode 100644 core/utils/copier/copier.go create mode 100644 core/utils/encrypt/encrypt.go create mode 100644 core/utils/files/files.go create mode 100644 core/utils/http/http.go create mode 100644 core/utils/jwt/jwt.go create mode 100644 core/utils/mfa/mfa.go diff --git a/core/app/api/v1/auth.go b/core/app/api/v1/auth.go new file mode 100644 index 000000000..e9e7a7588 --- /dev/null +++ b/core/app/api/v1/auth.go @@ -0,0 +1,186 @@ +package v1 + +import ( + "encoding/base64" + + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + + // "github.com/1Panel-dev/1Panel/core/middleware" + "github.com/1Panel-dev/1Panel/core/utils/captcha" + "github.com/gin-gonic/gin" +) + +type BaseApi struct{} + +// @Tags Auth +// @Summary User login +// @Description 用户登录 +// @Accept json +// @Param EntranceCode header string true "安全入口 base64 加密串" +// @Param request body dto.Login true "request" +// @Success 200 {object} dto.UserLoginInfo +// @Router /auth/login [post] +func (b *BaseApi) Login(c *gin.Context) { + var req dto.Login + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if req.AuthMethod != "jwt" && !req.IgnoreCaptcha { + if err := captcha.VerifyCode(req.CaptchaID, req.Captcha); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + } + entranceItem := c.Request.Header.Get("EntranceCode") + var entrance []byte + if len(entranceItem) != 0 { + entrance, _ = base64.StdEncoding.DecodeString(entranceItem) + } + + user, err := authService.Login(c, req, string(entrance)) + go saveLoginLogs(c, err) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, user) +} + +// @Tags Auth +// @Summary User login with mfa +// @Description 用户 mfa 登录 +// @Accept json +// @Param request body dto.MFALogin true "request" +// @Success 200 {object} dto.UserLoginInfo +// @Router /auth/mfalogin [post] +// @Header 200 {string} EntranceCode "安全入口" +func (b *BaseApi) MFALogin(c *gin.Context) { + var req dto.MFALogin + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + entranceItem := c.Request.Header.Get("EntranceCode") + var entrance []byte + if len(entranceItem) != 0 { + entrance, _ = base64.StdEncoding.DecodeString(entranceItem) + } + + user, err := authService.MFALogin(c, req, string(entrance)) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, user) +} + +// @Tags Auth +// @Summary User logout +// @Description 用户登出 +// @Success 200 +// @Security ApiKeyAuth +// @Router /auth/logout [post] +func (b *BaseApi) LogOut(c *gin.Context) { + if err := authService.LogOut(c); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags Auth +// @Summary Load captcha +// @Description 加载验证码 +// @Success 200 {object} dto.CaptchaResponse +// @Router /auth/captcha [get] +func (b *BaseApi) Captcha(c *gin.Context) { + captcha, err := captcha.CreateCaptcha() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, captcha) +} + +// @Tags Auth +// @Summary Load safety status +// @Description 获取系统安全登录状态 +// @Success 200 +// @Router /auth/issafety [get] +func (b *BaseApi) CheckIsSafety(c *gin.Context) { + code := c.DefaultQuery("code", "") + status, err := authService.CheckIsSafety(code) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + if status == "disable" && len(code) != 0 { + helper.ErrorWithDetail(c, constant.CodeErrNotFound, constant.ErrTypeInternalServer, err) + return + } + if status == "unpass" { + // if middleware.Get.LoadErrCode("err-entrance") != 200 { + // helper.ErrResponse(c, middleware.LoadErrCode("err-entrance")) + // return + // } + helper.ErrorWithDetail(c, constant.CodeErrEntrance, constant.ErrTypeInternalServer, nil) + return + } + helper.SuccessWithOutData(c) +} + +func (b *BaseApi) GetResponsePage(c *gin.Context) { + pageCode, err := authService.GetResponsePage() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, pageCode) +} + +// @Tags Auth +// @Summary Check System isDemo +// @Description 判断是否为demo环境 +// @Success 200 +// @Router /auth/demo [get] +func (b *BaseApi) CheckIsDemo(c *gin.Context) { + helper.SuccessWithData(c, global.CONF.System.IsDemo) +} + +// @Tags Auth +// @Summary Load System Language +// @Description 获取系统语言设置 +// @Success 200 +// @Router /auth/language [get] +func (b *BaseApi) GetLanguage(c *gin.Context) { + settingInfo, err := settingService.GetSettingInfo() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, settingInfo.Language) +} + +func saveLoginLogs(c *gin.Context, err error) { + var logs model.LoginLog + if err != nil { + logs.Status = constant.StatusFailed + logs.Message = err.Error() + } else { + logs.Status = constant.StatusSuccess + } + logs.IP = c.ClientIP() + // qqWry, err := qqwry.NewQQwry() + // if err != nil { + // global.LOG.Errorf("load qqwry datas failed: %s", err) + // } + // res := qqWry.Find(logs.IP) + logs.Agent = c.GetHeader("User-Agent") + // logs.Address = res.Area + _ = logService.CreateLoginLog(logs) +} diff --git a/core/app/api/v1/entry.go b/core/app/api/v1/entry.go new file mode 100644 index 000000000..f1a2c5c36 --- /dev/null +++ b/core/app/api/v1/entry.go @@ -0,0 +1,16 @@ +package v1 + +import "github.com/1Panel-dev/1Panel/core/app/service" + +type ApiGroup struct { + BaseApi +} + +var ApiGroupApp = new(ApiGroup) + +var ( + authService = service.NewIAuthService() + settingService = service.NewISettingService() + logService = service.NewILogService() + upgradeService = service.NewIUpgradeService() +) diff --git a/core/app/api/v1/helper/helper.go b/core/app/api/v1/helper/helper.go new file mode 100644 index 000000000..257c3e166 --- /dev/null +++ b/core/app/api/v1/helper/helper.go @@ -0,0 +1,86 @@ +package helper + +import ( + "net/http" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/buserr" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/i18n" + "github.com/gin-gonic/gin" + "github.com/pkg/errors" +) + +func ErrorWithDetail(ctx *gin.Context, code int, msgKey string, err error) { + res := dto.Response{ + Code: code, + Message: "", + } + if msgKey == constant.ErrTypeInternalServer { + switch { + case errors.Is(err, constant.ErrRecordExist): + res.Message = i18n.GetMsgWithMap("ErrRecordExist", nil) + case errors.Is(constant.ErrRecordNotFound, err): + res.Message = i18n.GetMsgWithMap("ErrRecordNotFound", nil) + case errors.Is(constant.ErrInvalidParams, err): + res.Message = i18n.GetMsgWithMap("ErrInvalidParams", nil) + case errors.Is(constant.ErrStructTransform, err): + res.Message = i18n.GetMsgWithMap("ErrStructTransform", map[string]interface{}{"detail": err}) + case errors.Is(constant.ErrCaptchaCode, err): + res.Code = constant.CodeAuth + res.Message = "ErrCaptchaCode" + case errors.Is(constant.ErrAuth, err): + res.Code = constant.CodeAuth + res.Message = "ErrAuth" + case errors.Is(constant.ErrInitialPassword, err): + res.Message = i18n.GetMsgWithMap("ErrInitialPassword", map[string]interface{}{"detail": err}) + case errors.As(err, &buserr.BusinessError{}): + res.Message = err.Error() + default: + res.Message = i18n.GetMsgWithMap(msgKey, map[string]interface{}{"detail": err}) + } + } else { + res.Message = i18n.GetMsgWithMap(msgKey, map[string]interface{}{"detail": err}) + } + ctx.JSON(http.StatusOK, res) + ctx.Abort() +} + +func SuccessWithData(ctx *gin.Context, data interface{}) { + if data == nil { + data = gin.H{} + } + res := dto.Response{ + Code: constant.CodeSuccess, + Data: data, + } + ctx.JSON(http.StatusOK, res) + ctx.Abort() +} + +func SuccessWithOutData(ctx *gin.Context) { + res := dto.Response{ + Code: constant.CodeSuccess, + Message: "success", + } + ctx.JSON(http.StatusOK, res) + ctx.Abort() +} + +func CheckBindAndValidate(req interface{}, c *gin.Context) error { + if err := c.ShouldBindJSON(req); err != nil { + ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return err + } + if err := global.VALID.Struct(req); err != nil { + ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return err + } + return nil +} + +func ErrResponse(ctx *gin.Context, code int) { + ctx.JSON(code, nil) + ctx.Abort() +} diff --git a/core/app/api/v1/logs.go b/core/app/api/v1/logs.go new file mode 100644 index 000000000..f88da7bac --- /dev/null +++ b/core/app/api/v1/logs.go @@ -0,0 +1,83 @@ +package v1 + +import ( + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/gin-gonic/gin" +) + +// @Tags Logs +// @Summary Page login logs +// @Description 获取系统登录日志列表分页 +// @Accept json +// @Param request body dto.SearchLgLogWithPage true "request" +// @Success 200 {object} dto.PageResult +// @Security ApiKeyAuth +// @Router /logs/login [post] +func (b *BaseApi) GetLoginLogs(c *gin.Context) { + var req dto.SearchLgLogWithPage + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + total, list, err := logService.PageLoginLog(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + helper.SuccessWithData(c, dto.PageResult{ + Items: list, + Total: total, + }) +} + +// @Tags Logs +// @Summary Page operation logs +// @Description 获取系统操作日志列表分页 +// @Accept json +// @Param request body dto.SearchOpLogWithPage true "request" +// @Success 200 {object} dto.PageResult +// @Security ApiKeyAuth +// @Router /logs/operation [post] +func (b *BaseApi) GetOperationLogs(c *gin.Context) { + var req dto.SearchOpLogWithPage + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + total, list, err := logService.PageOperationLog(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + helper.SuccessWithData(c, dto.PageResult{ + Items: list, + Total: total, + }) +} + +// @Tags Logs +// @Summary Clean operation logs +// @Description 清空操作日志 +// @Accept json +// @Param request body dto.CleanLog true "request" +// @Success 200 {object} dto.PageResult +// @Security ApiKeyAuth +// @Router /logs/clean [post] +// @x-panel-log {"bodyKeys":["logType"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清空 [logType] 日志信息","formatEN":"Clean the [logType] log information"} +func (b *BaseApi) CleanLogs(c *gin.Context) { + var req dto.CleanLog + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := logService.CleanLogs(req.LogType); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + helper.SuccessWithData(c, nil) +} diff --git a/core/app/api/v1/setting.go b/core/app/api/v1/setting.go new file mode 100644 index 000000000..b5bf4fe6c --- /dev/null +++ b/core/app/api/v1/setting.go @@ -0,0 +1,344 @@ +package v1 + +import ( + "encoding/base64" + "errors" + "os" + "path" + + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/mfa" + "github.com/gin-gonic/gin" +) + +// @Tags System Setting +// @Summary Load system setting info +// @Description 加载系统配置信息 +// @Success 200 {object} dto.SettingInfo +// @Security ApiKeyAuth +// @Router /settings/search [post] +func (b *BaseApi) GetSettingInfo(c *gin.Context) { + setting, err := settingService.GetSettingInfo() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, setting) +} + +// @Tags System Setting +// @Summary Load system available status +// @Description 获取系统可用状态 +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/search/available [get] +func (b *BaseApi) GetSystemAvailable(c *gin.Context) { + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Update system setting +// @Description 更新系统配置 +// @Accept json +// @Param request body dto.SettingUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/update [post] +// @x-panel-log {"bodyKeys":["key","value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改系统配置 [key] => [value]","formatEN":"update system setting [key] => [value]"} +func (b *BaseApi) UpdateSetting(c *gin.Context) { + var req dto.SettingUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.Update(req.Key, req.Value); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Update proxy setting +// @Description 服务器代理配置 +// @Accept json +// @Param request body dto.ProxyUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/proxy/update [post] +// @x-panel-log {"bodyKeys":["proxyUrl","proxyPort"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"服务器代理配置 [proxyPort]:[proxyPort]","formatEN":"set proxy [proxyPort]:[proxyPort]."} +func (b *BaseApi) UpdateProxy(c *gin.Context) { + var req dto.ProxyUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if len(req.ProxyPasswd) != 0 && len(req.ProxyType) != 0 { + pass, err := base64.StdEncoding.DecodeString(req.ProxyPasswd) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + req.ProxyPasswd = string(pass) + } + + if err := settingService.UpdateProxy(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Update system setting +// @Description 隐藏高级功能菜单 +// @Accept json +// @Param request body dto.SettingUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/menu/update [post] +// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"隐藏高级功能菜单","formatEN":"Hide advanced feature menu."} +func (b *BaseApi) UpdateMenu(c *gin.Context) { + var req dto.SettingUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.Update(req.Key, req.Value); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Update system password +// @Description 更新系统登录密码 +// @Accept json +// @Param request body dto.PasswordUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/password/update [post] +// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改系统密码","formatEN":"update system password"} +func (b *BaseApi) UpdatePassword(c *gin.Context) { + var req dto.PasswordUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.UpdatePassword(c, req.OldPassword, req.NewPassword); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Update system ssl +// @Description 修改系统 ssl 登录 +// @Accept json +// @Param request body dto.SSLUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/ssl/update [post] +// @x-panel-log {"bodyKeys":["ssl"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改系统 ssl => [ssl]","formatEN":"update system ssl => [ssl]"} +func (b *BaseApi) UpdateSSL(c *gin.Context) { + var req dto.SSLUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.UpdateSSL(c, req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Load system cert info +// @Description 获取证书信息 +// @Success 200 {object} dto.SettingInfo +// @Security ApiKeyAuth +// @Router /settings/ssl/info [get] +func (b *BaseApi) LoadFromCert(c *gin.Context) { + info, err := settingService.LoadFromCert() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, info) +} + +// @Tags System Setting +// @Summary Download system cert +// @Description 下载证书 +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/ssl/download [post] +func (b *BaseApi) DownloadSSL(c *gin.Context) { + pathItem := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt") + if _, err := os.Stat(pathItem); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + c.File(pathItem) +} + +// @Tags System Setting +// @Summary Load system address +// @Description 获取系统地址信息 +// @Accept json +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/interface [get] +func (b *BaseApi) LoadInterfaceAddr(c *gin.Context) { + data, err := settingService.LoadInterfaceAddr() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, data) +} + +// @Tags System Setting +// @Summary Update system bind info +// @Description 更新系统监听信息 +// @Accept json +// @Param request body dto.BindInfo true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/bind/update [post] +// @x-panel-log {"bodyKeys":["ipv6", "bindAddress"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改系统监听信息 => ipv6: [ipv6], 监听 IP: [bindAddress]","formatEN":"update system bind info => ipv6: [ipv6], 监听 IP: [bindAddress]"} +func (b *BaseApi) UpdateBindInfo(c *gin.Context) { + var req dto.BindInfo + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.UpdateBindInfo(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Update system port +// @Description 更新系统端口 +// @Accept json +// @Param request body dto.PortUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/port/update [post] +// @x-panel-log {"bodyKeys":["serverPort"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改系统端口 => [serverPort]","formatEN":"update system port => [serverPort]"} +func (b *BaseApi) UpdatePort(c *gin.Context) { + var req dto.PortUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.UpdatePort(req.ServerPort); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Reset system password expired +// @Description 重置过期系统登录密码 +// @Accept json +// @Param request body dto.PasswordUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/expired/handle [post] +// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"重置过期密码","formatEN":"reset an expired Password"} +func (b *BaseApi) HandlePasswordExpired(c *gin.Context) { + var req dto.PasswordUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := settingService.HandlePasswordExpired(c, req.OldPassword, req.NewPassword); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} + +// @Tags System Setting +// @Summary Load local backup dir +// @Description 获取安装根目录 +// @Success 200 {string} path +// @Security ApiKeyAuth +// @Router /settings/basedir [get] +func (b *BaseApi) LoadBaseDir(c *gin.Context) { + helper.SuccessWithData(c, global.CONF.System.DataDir) +} + +// @Tags System Setting +// @Summary Load mfa info +// @Description 获取 mfa 信息 +// @Accept json +// @Param request body dto.MfaCredential true "request" +// @Success 200 {object} mfa.Otp +// @Security ApiKeyAuth +// @Router /settings/mfa [post] +func (b *BaseApi) LoadMFA(c *gin.Context) { + var req dto.MfaRequest + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + otp, err := mfa.GetOtp("admin", req.Title, req.Interval) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + helper.SuccessWithData(c, otp) +} + +// @Tags System Setting +// @Summary Bind mfa +// @Description Mfa 绑定 +// @Accept json +// @Param request body dto.MfaCredential true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/mfa/bind [post] +// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"mfa 绑定","formatEN":"bind mfa"} +func (b *BaseApi) MFABind(c *gin.Context) { + var req dto.MfaCredential + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + success := mfa.ValidCode(req.Code, req.Interval, req.Secret) + if !success { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, errors.New("code is not valid")) + return + } + + if err := settingService.Update("MFAInterval", req.Interval); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + if err := settingService.Update("MFAStatus", "enable"); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + if err := settingService.Update("MFASecret", req.Secret); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + helper.SuccessWithData(c, nil) +} diff --git a/core/app/api/v1/upgrade.go b/core/app/api/v1/upgrade.go new file mode 100644 index 000000000..62d5fe30e --- /dev/null +++ b/core/app/api/v1/upgrade.go @@ -0,0 +1,67 @@ +package v1 + +import ( + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/gin-gonic/gin" +) + +// @Tags System Setting +// @Summary Load upgrade info +// @Description 系统更新信息 +// @Success 200 {object} dto.UpgradeInfo +// @Security ApiKeyAuth +// @Router /settings/upgrade [get] +func (b *BaseApi) GetUpgradeInfo(c *gin.Context) { + info, err := upgradeService.SearchUpgrade() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, info) +} + +// @Tags System Setting +// @Summary Load release notes by version +// @Description 获取版本 release notes +// @Accept json +// @Param request body dto.Upgrade true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/upgrade [get] +func (b *BaseApi) GetNotesByVersion(c *gin.Context) { + var req dto.Upgrade + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + notes, err := upgradeService.LoadNotes(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, notes) +} + +// @Tags System Setting +// @Summary Upgrade +// @Description 系统更新 +// @Accept json +// @Param request body dto.Upgrade true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/upgrade [post] +// @x-panel-log {"bodyKeys":["version"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新系统 => [version]","formatEN":"upgrade system => [version]"} +func (b *BaseApi) Upgrade(c *gin.Context) { + var req dto.Upgrade + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := upgradeService.Upgrade(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} diff --git a/core/app/dto/auth.go b/core/app/dto/auth.go new file mode 100644 index 000000000..ccaa2ec12 --- /dev/null +++ b/core/app/dto/auth.go @@ -0,0 +1,40 @@ +package dto + +type CaptchaResponse struct { + CaptchaID string `json:"captchaID"` + ImagePath string `json:"imagePath"` +} + +type UserLoginInfo struct { + Name string `json:"name"` + Token string `json:"token"` + MfaStatus string `json:"mfaStatus"` +} + +type MfaRequest struct { + Title string `json:"title" validate:"required"` + Interval int `json:"interval" validate:"required"` +} + +type MfaCredential struct { + Secret string `json:"secret" validate:"required"` + Code string `json:"code" validate:"required"` + Interval string `json:"interval" validate:"required"` +} + +type Login struct { + Name string `json:"name" validate:"required"` + Password string `json:"password" validate:"required"` + IgnoreCaptcha bool `json:"ignoreCaptcha"` + Captcha string `json:"captcha"` + CaptchaID string `json:"captchaID"` + AuthMethod string `json:"authMethod" validate:"required,oneof=jwt session"` + Language string `json:"language" validate:"required,oneof=zh en tw"` +} + +type MFALogin struct { + Name string `json:"name" validate:"required"` + Password string `json:"password" validate:"required"` + Code string `json:"code" validate:"required"` + AuthMethod string `json:"authMethod"` +} diff --git a/core/app/dto/common_req.go b/core/app/dto/common_req.go new file mode 100644 index 000000000..b493fac55 --- /dev/null +++ b/core/app/dto/common_req.go @@ -0,0 +1,54 @@ +package dto + +type SearchWithPage struct { + PageInfo + Info string `json:"info"` +} + +type PageInfo struct { + Page int `json:"page" validate:"required,number"` + PageSize int `json:"pageSize" validate:"required,number"` +} + +type UpdateDescription struct { + ID uint `json:"id" validate:"required"` + Description string `json:"description" validate:"max=256"` +} + +type OperationWithName struct { + Name string `json:"name" validate:"required"` +} + +type OperateByID struct { + ID uint `json:"id" validate:"required"` +} + +type Operate struct { + Operation string `json:"operation" validate:"required"` +} + +type BatchDeleteReq struct { + Ids []uint `json:"ids" validate:"required"` +} + +type FilePath struct { + Path string `json:"path" validate:"required"` +} + +type DeleteByName struct { + Name string `json:"name" validate:"required"` +} + +type UpdateByFile struct { + File string `json:"file"` +} + +type UpdateByNameAndFile struct { + Name string `json:"name"` + File string `json:"file"` +} + +type OperationWithNameAndType struct { + Name string `json:"name"` + Type string `json:"type" validate:"required"` +} diff --git a/core/app/dto/common_res.go b/core/app/dto/common_res.go new file mode 100644 index 000000000..5c7c11193 --- /dev/null +++ b/core/app/dto/common_res.go @@ -0,0 +1,16 @@ +package dto + +type PageResult struct { + Total int64 `json:"total"` + Items interface{} `json:"items"` +} + +type Response struct { + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data"` +} + +type Options struct { + Option string `json:"option"` +} diff --git a/core/app/dto/logs.go b/core/app/dto/logs.go new file mode 100644 index 000000000..8831801db --- /dev/null +++ b/core/app/dto/logs.go @@ -0,0 +1,50 @@ +package dto + +import ( + "time" +) + +type OperationLog struct { + ID uint `json:"id"` + Source string `json:"source"` + + IP string `json:"ip"` + Path string `json:"path"` + Method string `json:"method"` + UserAgent string `json:"userAgent"` + + Latency time.Duration `json:"latency"` + Status string `json:"status"` + Message string `json:"message"` + + DetailZH string `json:"detailZH"` + DetailEN string `json:"detailEN"` + CreatedAt time.Time `json:"createdAt"` +} + +type SearchOpLogWithPage struct { + PageInfo + Source string `json:"source"` + Status string `json:"status"` + Operation string `json:"operation"` +} + +type SearchLgLogWithPage struct { + PageInfo + IP string `json:"ip"` + Status string `json:"status"` +} + +type LoginLog struct { + ID uint `json:"id"` + IP string `json:"ip"` + Address string `json:"address"` + Agent string `json:"agent"` + Status string `json:"status"` + Message string `json:"message"` + CreatedAt time.Time `json:"createdAt"` +} + +type CleanLog struct { + LogType string `json:"logType" validate:"required,oneof=login operation"` +} diff --git a/core/app/dto/setting.go b/core/app/dto/setting.go new file mode 100644 index 000000000..29f8b24a2 --- /dev/null +++ b/core/app/dto/setting.go @@ -0,0 +1,220 @@ +package dto + +import "time" + +type SettingInfo struct { + UserName string `json:"userName"` + Email string `json:"email"` + SystemIP string `json:"systemIP"` + SystemVersion string `json:"systemVersion"` + DockerSockPath string `json:"dockerSockPath"` + DeveloperMode string `json:"developerMode"` + + SessionTimeout string `json:"sessionTimeout"` + LocalTime string `json:"localTime"` + TimeZone string `json:"timeZone"` + NtpSite string `json:"ntpSite"` + + Port string `json:"port"` + Ipv6 string `json:"ipv6"` + BindAddress string `json:"bindAddress"` + PanelName string `json:"panelName"` + Theme string `json:"theme"` + MenuTabs string `json:"menuTabs"` + Language string `json:"language"` + DefaultNetwork string `json:"defaultNetwork"` + LastCleanTime string `json:"lastCleanTime"` + LastCleanSize string `json:"lastCleanSize"` + LastCleanData string `json:"lastCleanData"` + + ServerPort string `json:"serverPort"` + SSL string `json:"ssl"` + SSLType string `json:"sslType"` + BindDomain string `json:"bindDomain"` + AllowIPs string `json:"allowIPs"` + SecurityEntrance string `json:"securityEntrance"` + ExpirationDays string `json:"expirationDays"` + ExpirationTime string `json:"expirationTime"` + ComplexityVerification string `json:"complexityVerification"` + MFAStatus string `json:"mfaStatus"` + MFASecret string `json:"mfaSecret"` + MFAInterval string `json:"mfaInterval"` + + MonitorStatus string `json:"monitorStatus"` + MonitorInterval string `json:"monitorInterval"` + MonitorStoreDays string `json:"monitorStoreDays"` + + MessageType string `json:"messageType"` + EmailVars string `json:"emailVars"` + WeChatVars string `json:"weChatVars"` + DingVars string `json:"dingVars"` + + AppStoreVersion string `json:"appStoreVersion"` + AppStoreLastModified string `json:"appStoreLastModified"` + AppStoreSyncStatus string `json:"appStoreSyncStatus"` + + FileRecycleBin string `json:"fileRecycleBin"` + + SnapshotIgnore string `json:"snapshotIgnore"` + XpackHideMenu string `json:"xpackHideMenu"` + NoAuthSetting string `json:"noAuthSetting"` + + ProxyUrl string `json:"proxyUrl"` + ProxyType string `json:"proxyType"` + ProxyPort string `json:"proxyPort"` + ProxyUser string `json:"proxyUser"` + ProxyPasswd string `json:"proxyPasswd"` + ProxyPasswdKeep string `json:"proxyPasswdKeep"` +} + +type SettingUpdate struct { + Key string `json:"key" validate:"required"` + Value string `json:"value"` +} + +type SSLUpdate struct { + SSLType string `json:"sslType" validate:"required,oneof=self select import import-paste import-local"` + Domain string `json:"domain"` + SSL string `json:"ssl" validate:"required,oneof=enable disable"` + Cert string `json:"cert"` + Key string `json:"key"` + SSLID uint `json:"sslID"` +} +type SSLInfo struct { + Domain string `json:"domain"` + Timeout string `json:"timeout"` + RootPath string `json:"rootPath"` + Cert string `json:"cert"` + Key string `json:"key"` + SSLID uint `json:"sslID"` +} + +type PasswordUpdate struct { + OldPassword string `json:"oldPassword" validate:"required"` + NewPassword string `json:"newPassword" validate:"required"` +} + +type PortUpdate struct { + ServerPort uint `json:"serverPort" validate:"required,number,max=65535,min=1"` +} + +type SnapshotStatus struct { + Panel string `json:"panel"` + PanelInfo string `json:"panelInfo"` + DaemonJson string `json:"daemonJson"` + AppData string `json:"appData"` + PanelData string `json:"panelData"` + BackupData string `json:"backupData"` + + Compress string `json:"compress"` + Size string `json:"size"` + Upload string `json:"upload"` +} + +type SnapshotCreate struct { + ID uint `json:"id"` + From string `json:"from" validate:"required"` + DefaultDownload string `json:"defaultDownload" validate:"required"` + Description string `json:"description" validate:"max=256"` + Secret string `json:"secret"` +} +type SnapshotRecover struct { + IsNew bool `json:"isNew"` + ReDownload bool `json:"reDownload"` + ID uint `json:"id" validate:"required"` + Secret string `json:"secret"` +} +type SnapshotBatchDelete struct { + DeleteWithFile bool `json:"deleteWithFile"` + Ids []uint `json:"ids" validate:"required"` +} +type SnapshotImport struct { + From string `json:"from"` + Names []string `json:"names"` + Description string `json:"description" validate:"max=256"` +} +type SnapshotInfo struct { + ID uint `json:"id"` + Name string `json:"name"` + Description string `json:"description" validate:"max=256"` + From string `json:"from"` + DefaultDownload string `json:"defaultDownload"` + Status string `json:"status"` + Message string `json:"message"` + CreatedAt time.Time `json:"createdAt"` + Version string `json:"version"` + Size int64 `json:"size"` + + InterruptStep string `json:"interruptStep"` + RecoverStatus string `json:"recoverStatus"` + RecoverMessage string `json:"recoverMessage"` + LastRecoveredAt string `json:"lastRecoveredAt"` + RollbackStatus string `json:"rollbackStatus"` + RollbackMessage string `json:"rollbackMessage"` + LastRollbackedAt string `json:"lastRollbackedAt"` +} + +type UpgradeInfo struct { + TestVersion string `json:"testVersion"` + NewVersion string `json:"newVersion"` + LatestVersion string `json:"latestVersion"` + ReleaseNote string `json:"releaseNote"` +} + +type SyncTime struct { + NtpSite string `json:"ntpSite" validate:"required"` +} + +type BindInfo struct { + Ipv6 string `json:"ipv6" validate:"required,oneof=enable disable"` + BindAddress string `json:"bindAddress" validate:"required"` +} + +type Upgrade struct { + Version string `json:"version" validate:"required"` +} + +type ProxyUpdate struct { + ProxyUrl string `json:"proxyUrl"` + ProxyType string `json:"proxyType"` + ProxyPort string `json:"proxyPort"` + ProxyUser string `json:"proxyUser"` + ProxyPasswd string `json:"proxyPasswd"` + ProxyPasswdKeep string `json:"proxyPasswdKeep"` +} + +type CleanData struct { + SystemClean []CleanTree `json:"systemClean"` + UploadClean []CleanTree `json:"uploadClean"` + DownloadClean []CleanTree `json:"downloadClean"` + SystemLogClean []CleanTree `json:"systemLogClean"` + ContainerClean []CleanTree `json:"containerClean"` +} + +type CleanTree struct { + ID string `json:"id"` + Label string `json:"label"` + Children []CleanTree `json:"children"` + + Type string `json:"type"` + Name string `json:"name"` + + Size uint64 `json:"size"` + IsCheck bool `json:"isCheck"` + IsRecommend bool `json:"isRecommend"` +} + +type Clean struct { + TreeType string `json:"treeType"` + Name string `json:"name"` + Size uint64 `json:"size"` +} + +type XpackHideMenu struct { + ID string `json:"id"` + Label string `json:"label"` + IsCheck bool `json:"isCheck"` + Title string `json:"title"` + Path string `json:"path,omitempty"` + Children []XpackHideMenu `json:"children,omitempty"` +} diff --git a/core/app/model/base.go b/core/app/model/base.go new file mode 100644 index 000000000..69921d41d --- /dev/null +++ b/core/app/model/base.go @@ -0,0 +1,9 @@ +package model + +import "time" + +type BaseModel struct { + ID uint `gorm:"primarykey;AUTO_INCREMENT" json:"id"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +} diff --git a/core/app/model/logs.go b/core/app/model/logs.go new file mode 100644 index 000000000..4018f4322 --- /dev/null +++ b/core/app/model/logs.go @@ -0,0 +1,31 @@ +package model + +import ( + "time" +) + +type OperationLog struct { + BaseModel + Source string `gorm:"type:varchar(64)" json:"source"` + + IP string `gorm:"type:varchar(64)" json:"ip"` + Path string `gorm:"type:varchar(64)" json:"path"` + Method string `gorm:"type:varchar(64)" json:"method"` + UserAgent string `gorm:"type:varchar(256)" json:"userAgent"` + + Latency time.Duration `gorm:"type:varchar(64)" json:"latency"` + Status string `gorm:"type:varchar(64)" json:"status"` + Message string `gorm:"type:varchar(256)" json:"message"` + + DetailZH string `gorm:"type:varchar(256)" json:"detailZH"` + DetailEN string `gorm:"type:varchar(256)" json:"detailEN"` +} + +type LoginLog struct { + BaseModel + IP string `gorm:"type:varchar(64)" json:"ip"` + Address string `gorm:"type:varchar(64)" json:"address"` + Agent string `gorm:"type:varchar(256)" json:"agent"` + Status string `gorm:"type:varchar(64)" json:"status"` + Message string `gorm:"type:longText" json:"message"` +} diff --git a/core/app/model/setting.go b/core/app/model/setting.go new file mode 100644 index 000000000..e9791b79b --- /dev/null +++ b/core/app/model/setting.go @@ -0,0 +1,8 @@ +package model + +type Setting struct { + BaseModel + Key string `json:"key" gorm:"type:varchar(256);not null;"` + Value string `json:"value" gorm:"type:varchar(256)"` + About string `json:"about" gorm:"type:longText"` +} diff --git a/core/app/repo/common.go b/core/app/repo/common.go new file mode 100644 index 000000000..1cb726c2a --- /dev/null +++ b/core/app/repo/common.go @@ -0,0 +1,128 @@ +package repo + +import ( + "fmt" + "time" + + "github.com/1Panel-dev/1Panel/core/constant" + "gorm.io/gorm" +) + +type DBOption func(*gorm.DB) *gorm.DB + +type ICommonRepo interface { + WithByID(id uint) DBOption + WithByName(name string) DBOption + WithByType(tp string) DBOption + WithOrderBy(orderStr string) DBOption + WithOrderRuleBy(orderBy, order string) DBOption + WithByGroupID(groupID uint) DBOption + WithLikeName(name string) DBOption + WithIdsIn(ids []uint) DBOption + WithByDate(startTime, endTime time.Time) DBOption + WithByStartDate(startTime time.Time) DBOption + WithByStatus(status string) DBOption + WithByFrom(from string) DBOption +} + +type CommonRepo struct{} + +func NewCommonRepo() ICommonRepo { + return &CommonRepo{} +} + +func (c *CommonRepo) WithByID(id uint) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("id = ?", id) + } +} + +func (c *CommonRepo) WithByName(name string) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("name = ?", name) + } +} + +func (c *CommonRepo) WithByDate(startTime, endTime time.Time) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("start_time > ? AND start_time < ?", startTime, endTime) + } +} + +func (c *CommonRepo) WithByStartDate(startTime time.Time) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("start_time < ?", startTime) + } +} + +func (c *CommonRepo) WithByType(tp string) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("type = ?", tp) + } +} + +func (c *CommonRepo) WithByGroupID(groupID uint) DBOption { + return func(g *gorm.DB) *gorm.DB { + if groupID == 0 { + return g + } + return g.Where("group_id = ?", groupID) + } +} + +func (c *CommonRepo) WithByStatus(status string) DBOption { + return func(g *gorm.DB) *gorm.DB { + if len(status) == 0 { + return g + } + return g.Where("status = ?", status) + } +} + +func (c *CommonRepo) WithByFrom(from string) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("`from` = ?", from) + } +} + +func (c *CommonRepo) WithLikeName(name string) DBOption { + return func(g *gorm.DB) *gorm.DB { + if len(name) == 0 { + return g + } + return g.Where("name like ?", "%"+name+"%") + } +} + +func (c *CommonRepo) WithOrderBy(orderStr string) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Order(orderStr) + } +} + +func (c *CommonRepo) WithOrderRuleBy(orderBy, order string) DBOption { + switch order { + case constant.OrderDesc: + order = "desc" + case constant.OrderAsc: + order = "asc" + default: + orderBy = "created_at" + order = "desc" + } + return func(g *gorm.DB) *gorm.DB { + return g.Order(fmt.Sprintf("%s %s", orderBy, order)) + } +} + +func (c *CommonRepo) WithIdsIn(ids []uint) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("id in (?)", ids) + } +} + +func (c *CommonRepo) WithIdsNotIn(ids []uint) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("id not in (?)", ids) + } +} diff --git a/core/app/repo/logs.go b/core/app/repo/logs.go new file mode 100644 index 000000000..6b094b9f7 --- /dev/null +++ b/core/app/repo/logs.go @@ -0,0 +1,101 @@ +package repo + +import ( + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/global" + "gorm.io/gorm" +) + +type LogRepo struct{} + +type ILogRepo interface { + CleanLogin() error + CreateLoginLog(user *model.LoginLog) error + PageLoginLog(limit, offset int, opts ...DBOption) (int64, []model.LoginLog, error) + + WithByIP(ip string) DBOption + WithByStatus(status string) DBOption + WithByGroup(group string) DBOption + WithByLikeOperation(operation string) DBOption + CleanOperation() error + CreateOperationLog(user *model.OperationLog) error + PageOperationLog(limit, offset int, opts ...DBOption) (int64, []model.OperationLog, error) +} + +func NewILogRepo() ILogRepo { + return &LogRepo{} +} + +func (u *LogRepo) CleanLogin() error { + return global.DB.Exec("delete from login_logs;").Error +} + +func (u *LogRepo) CreateLoginLog(log *model.LoginLog) error { + return global.DB.Create(log).Error +} + +func (u *LogRepo) PageLoginLog(page, size int, opts ...DBOption) (int64, []model.LoginLog, error) { + var ops []model.LoginLog + db := global.DB.Model(&model.LoginLog{}) + for _, opt := range opts { + db = opt(db) + } + count := int64(0) + db = db.Count(&count) + err := db.Limit(size).Offset(size * (page - 1)).Find(&ops).Error + return count, ops, err +} + +func (u *LogRepo) CleanOperation() error { + return global.DB.Exec("delete from operation_logs").Error +} + +func (u *LogRepo) CreateOperationLog(log *model.OperationLog) error { + return global.DB.Create(log).Error +} + +func (u *LogRepo) PageOperationLog(page, size int, opts ...DBOption) (int64, []model.OperationLog, error) { + var ops []model.OperationLog + db := global.DB.Model(&model.OperationLog{}) + for _, opt := range opts { + db = opt(db) + } + count := int64(0) + db = db.Count(&count) + err := db.Limit(size).Offset(size * (page - 1)).Find(&ops).Error + return count, ops, err +} + +func (c *LogRepo) WithByStatus(status string) DBOption { + return func(g *gorm.DB) *gorm.DB { + if len(status) == 0 { + return g + } + return g.Where("status = ?", status) + } +} +func (c *LogRepo) WithByGroup(group string) DBOption { + return func(g *gorm.DB) *gorm.DB { + if len(group) == 0 { + return g + } + return g.Where("source = ?", group) + } +} +func (c *LogRepo) WithByIP(ip string) DBOption { + return func(g *gorm.DB) *gorm.DB { + if len(ip) == 0 { + return g + } + return g.Where("ip LIKE ?", "%"+ip+"%") + } +} +func (c *LogRepo) WithByLikeOperation(operation string) DBOption { + return func(g *gorm.DB) *gorm.DB { + if len(operation) == 0 { + return g + } + infoStr := "%" + operation + "%" + return g.Where("detail_zh LIKE ? OR detail_en LIKE ?", infoStr, infoStr) + } +} diff --git a/core/app/repo/setting.go b/core/app/repo/setting.go new file mode 100644 index 000000000..4e8358b10 --- /dev/null +++ b/core/app/repo/setting.go @@ -0,0 +1,59 @@ +package repo + +import ( + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/global" + "gorm.io/gorm" +) + +type SettingRepo struct{} + +type ISettingRepo interface { + GetList(opts ...DBOption) ([]model.Setting, error) + Get(opts ...DBOption) (model.Setting, error) + Create(key, value string) error + Update(key, value string) error + WithByKey(key string) DBOption +} + +func NewISettingRepo() ISettingRepo { + return &SettingRepo{} +} + +func (u *SettingRepo) GetList(opts ...DBOption) ([]model.Setting, error) { + var settings []model.Setting + db := global.DB.Model(&model.Setting{}) + for _, opt := range opts { + db = opt(db) + } + err := db.Find(&settings).Error + return settings, err +} + +func (u *SettingRepo) Create(key, value string) error { + setting := &model.Setting{ + Key: key, + Value: value, + } + return global.DB.Create(setting).Error +} + +func (u *SettingRepo) Get(opts ...DBOption) (model.Setting, error) { + var settings model.Setting + db := global.DB.Model(&model.Setting{}) + for _, opt := range opts { + db = opt(db) + } + err := db.First(&settings).Error + return settings, err +} + +func (c *SettingRepo) WithByKey(key string) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("key = ?", key) + } +} + +func (u *SettingRepo) Update(key, value string) error { + return global.DB.Model(&model.Setting{}).Where("key = ?", key).Updates(map[string]interface{}{"value": value}).Error +} diff --git a/core/app/service/auth.go b/core/app/service/auth.go new file mode 100644 index 000000000..e8ae8b9d6 --- /dev/null +++ b/core/app/service/auth.go @@ -0,0 +1,196 @@ +package service + +import ( + "crypto/hmac" + "strconv" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/buserr" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/encrypt" + "github.com/1Panel-dev/1Panel/core/utils/jwt" + "github.com/1Panel-dev/1Panel/core/utils/mfa" + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/pkg/errors" +) + +type AuthService struct{} + +type IAuthService interface { + CheckIsSafety(code string) (string, error) + GetResponsePage() (string, error) + VerifyCode(code string) (bool, error) + Login(c *gin.Context, info dto.Login, entrance string) (*dto.UserLoginInfo, error) + LogOut(c *gin.Context) error + MFALogin(c *gin.Context, info dto.MFALogin, entrance string) (*dto.UserLoginInfo, error) +} + +func NewIAuthService() IAuthService { + return &AuthService{} +} + +func (u *AuthService) Login(c *gin.Context, info dto.Login, entrance string) (*dto.UserLoginInfo, error) { + nameSetting, err := settingRepo.Get(settingRepo.WithByKey("UserName")) + if err != nil { + return nil, errors.WithMessage(constant.ErrRecordNotFound, err.Error()) + } + passwordSetting, err := settingRepo.Get(settingRepo.WithByKey("Password")) + if err != nil { + return nil, errors.WithMessage(constant.ErrRecordNotFound, err.Error()) + } + pass, err := encrypt.StringDecrypt(passwordSetting.Value) + if err != nil { + return nil, constant.ErrAuth + } + if !hmac.Equal([]byte(info.Password), []byte(pass)) || nameSetting.Value != info.Name { + return nil, constant.ErrAuth + } + entranceSetting, err := settingRepo.Get(settingRepo.WithByKey("SecurityEntrance")) + if err != nil { + return nil, err + } + if len(entranceSetting.Value) != 0 && entranceSetting.Value != entrance { + return nil, buserr.New(constant.ErrEntrance) + } + mfa, err := settingRepo.Get(settingRepo.WithByKey("MFAStatus")) + if err != nil { + return nil, err + } + if err = settingRepo.Update("Language", info.Language); err != nil { + return nil, err + } + if mfa.Value == "enable" { + return &dto.UserLoginInfo{Name: nameSetting.Value, MfaStatus: mfa.Value}, nil + } + return u.generateSession(c, info.Name, info.AuthMethod) +} + +func (u *AuthService) MFALogin(c *gin.Context, info dto.MFALogin, entrance string) (*dto.UserLoginInfo, error) { + nameSetting, err := settingRepo.Get(settingRepo.WithByKey("UserName")) + if err != nil { + return nil, errors.WithMessage(constant.ErrRecordNotFound, err.Error()) + } + passwordSetting, err := settingRepo.Get(settingRepo.WithByKey("Password")) + if err != nil { + return nil, errors.WithMessage(constant.ErrRecordNotFound, err.Error()) + } + pass, err := encrypt.StringDecrypt(passwordSetting.Value) + if err != nil { + return nil, err + } + if !hmac.Equal([]byte(info.Password), []byte(pass)) || nameSetting.Value != info.Name { + return nil, constant.ErrAuth + } + entranceSetting, err := settingRepo.Get(settingRepo.WithByKey("SecurityEntrance")) + if err != nil { + return nil, err + } + if len(entranceSetting.Value) != 0 && entranceSetting.Value != entrance { + return nil, buserr.New(constant.ErrEntrance) + } + mfaSecret, err := settingRepo.Get(settingRepo.WithByKey("MFASecret")) + if err != nil { + return nil, err + } + mfaInterval, err := settingRepo.Get(settingRepo.WithByKey("MFAInterval")) + if err != nil { + return nil, err + } + success := mfa.ValidCode(info.Code, mfaInterval.Value, mfaSecret.Value) + if !success { + return nil, constant.ErrAuth + } + + return u.generateSession(c, info.Name, info.AuthMethod) +} + +func (u *AuthService) generateSession(c *gin.Context, name, authMethod string) (*dto.UserLoginInfo, error) { + setting, err := settingRepo.Get(settingRepo.WithByKey("SessionTimeout")) + if err != nil { + return nil, err + } + httpsSetting, err := settingRepo.Get(settingRepo.WithByKey("SSL")) + if err != nil { + return nil, err + } + lifeTime, err := strconv.Atoi(setting.Value) + if err != nil { + return nil, err + } + + if authMethod == constant.AuthMethodJWT { + j := jwt.NewJWT() + claims := j.CreateClaims(jwt.BaseClaims{ + Name: name, + }) + token, err := j.CreateToken(claims) + if err != nil { + return nil, err + } + return &dto.UserLoginInfo{Name: name, Token: token}, nil + } + sID, _ := c.Cookie(constant.SessionName) + sessionUser, err := global.SESSION.Get(sID) + if err != nil { + sID = uuid.New().String() + c.SetCookie(constant.SessionName, sID, 0, "", "", httpsSetting.Value == "enable", true) + err := global.SESSION.Set(sID, sessionUser, lifeTime) + if err != nil { + return nil, err + } + return &dto.UserLoginInfo{Name: name}, nil + } + if err := global.SESSION.Set(sID, sessionUser, lifeTime); err != nil { + return nil, err + } + + return &dto.UserLoginInfo{Name: name}, nil +} + +func (u *AuthService) LogOut(c *gin.Context) error { + httpsSetting, err := settingRepo.Get(settingRepo.WithByKey("SSL")) + if err != nil { + return err + } + sID, _ := c.Cookie(constant.SessionName) + if sID != "" { + c.SetCookie(constant.SessionName, sID, -1, "", "", httpsSetting.Value == "enable", true) + err := global.SESSION.Delete(sID) + if err != nil { + return err + } + } + return nil +} + +func (u *AuthService) VerifyCode(code string) (bool, error) { + setting, err := settingRepo.Get(settingRepo.WithByKey("SecurityEntrance")) + if err != nil { + return false, err + } + return hmac.Equal([]byte(setting.Value), []byte(code)), nil +} + +func (u *AuthService) CheckIsSafety(code string) (string, error) { + status, err := settingRepo.Get(settingRepo.WithByKey("SecurityEntrance")) + if err != nil { + return "", err + } + if len(status.Value) == 0 { + return "disable", nil + } + if status.Value == code { + return "pass", nil + } + return "unpass", nil +} + +func (u *AuthService) GetResponsePage() (string, error) { + pageCode, err := settingRepo.Get(settingRepo.WithByKey("NoAuthSetting")) + if err != nil { + return "", err + } + return pageCode.Value, nil +} diff --git a/core/app/service/entry.go b/core/app/service/entry.go new file mode 100644 index 000000000..f4987166d --- /dev/null +++ b/core/app/service/entry.go @@ -0,0 +1,9 @@ +package service + +import "github.com/1Panel-dev/1Panel/core/app/repo" + +var ( + commonRepo = repo.NewCommonRepo() + settingRepo = repo.NewISettingRepo() + logRepo = repo.NewILogRepo() +) diff --git a/core/app/service/logs.go b/core/app/service/logs.go new file mode 100644 index 000000000..ffafb46e2 --- /dev/null +++ b/core/app/service/logs.go @@ -0,0 +1,128 @@ +package service + +import ( + "os" + "path" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/jinzhu/copier" + "github.com/pkg/errors" +) + +type LogService struct{} + +const logs = "https://resource.fit2cloud.com/installation-log.sh" + +type ILogService interface { + ListSystemLogFile() ([]string, error) + CreateLoginLog(operation model.LoginLog) error + PageLoginLog(search dto.SearchLgLogWithPage) (int64, interface{}, error) + + CreateOperationLog(operation model.OperationLog) error + PageOperationLog(search dto.SearchOpLogWithPage) (int64, interface{}, error) + + CleanLogs(logtype string) error +} + +func NewILogService() ILogService { + return &LogService{} +} + +func (u *LogService) CreateLoginLog(operation model.LoginLog) error { + return logRepo.CreateLoginLog(&operation) +} + +func (u *LogService) ListSystemLogFile() ([]string, error) { + logDir := path.Join(global.CONF.System.BaseDir, "1panel/log") + var files []string + if err := filepath.Walk(logDir, func(pathItem string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() && strings.HasPrefix(info.Name(), "1Panel") { + if info.Name() == "1Panel.log" { + files = append(files, time.Now().Format("2006-01-02")) + return nil + } + itemFileName := strings.TrimPrefix(info.Name(), "1Panel-") + itemFileName = strings.TrimSuffix(itemFileName, ".gz") + itemFileName = strings.TrimSuffix(itemFileName, ".log") + files = append(files, itemFileName) + return nil + } + return nil + }); err != nil { + return nil, err + } + + if len(files) < 2 { + return files, nil + } + sort.Slice(files, func(i, j int) bool { + return files[i] > files[j] + }) + + return files, nil +} + +func (u *LogService) PageLoginLog(req dto.SearchLgLogWithPage) (int64, interface{}, error) { + total, ops, err := logRepo.PageLoginLog( + req.Page, + req.PageSize, + logRepo.WithByIP(req.IP), + logRepo.WithByStatus(req.Status), + commonRepo.WithOrderBy("created_at desc"), + ) + var dtoOps []dto.LoginLog + for _, op := range ops { + var item dto.LoginLog + if err := copier.Copy(&item, &op); err != nil { + return 0, nil, errors.WithMessage(constant.ErrStructTransform, err.Error()) + } + dtoOps = append(dtoOps, item) + } + return total, dtoOps, err +} + +func (u *LogService) CreateOperationLog(operation model.OperationLog) error { + return logRepo.CreateOperationLog(&operation) +} + +func (u *LogService) PageOperationLog(req dto.SearchOpLogWithPage) (int64, interface{}, error) { + total, ops, err := logRepo.PageOperationLog( + req.Page, + req.PageSize, + logRepo.WithByGroup(req.Source), + logRepo.WithByLikeOperation(req.Operation), + logRepo.WithByStatus(req.Status), + commonRepo.WithOrderBy("created_at desc"), + ) + var dtoOps []dto.OperationLog + for _, op := range ops { + var item dto.OperationLog + if err := copier.Copy(&item, &op); err != nil { + return 0, nil, errors.WithMessage(constant.ErrStructTransform, err.Error()) + } + dtoOps = append(dtoOps, item) + } + return total, dtoOps, err +} + +func (u *LogService) CleanLogs(logtype string) error { + if logtype == "operation" { + return logRepo.CleanOperation() + } + return logRepo.CleanLogin() +} + +func writeLogs(version string) { + _, _ = cmd.Execf("curl -sfL %s | sh -s 1p upgrade %s", logs, version) +} diff --git a/core/app/service/setting.go b/core/app/service/setting.go new file mode 100644 index 000000000..9115efd1d --- /dev/null +++ b/core/app/service/setting.go @@ -0,0 +1,403 @@ +package service + +import ( + "crypto/tls" + "crypto/x509" + "encoding/json" + "encoding/pem" + "fmt" + "net" + "os" + "path" + "strconv" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/buserr" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/common" + "github.com/1Panel-dev/1Panel/core/utils/encrypt" + "github.com/gin-gonic/gin" +) + +type SettingService struct{} + +type ISettingService interface { + GetSettingInfo() (*dto.SettingInfo, error) + LoadInterfaceAddr() ([]string, error) + Update(key, value string) error + UpdateProxy(req dto.ProxyUpdate) error + UpdatePassword(c *gin.Context, old, new string) error + UpdatePort(port uint) error + UpdateBindInfo(req dto.BindInfo) error + UpdateSSL(c *gin.Context, req dto.SSLUpdate) error + LoadFromCert() (*dto.SSLInfo, error) + HandlePasswordExpired(c *gin.Context, old, new string) error +} + +func NewISettingService() ISettingService { + return &SettingService{} +} + +func (u *SettingService) GetSettingInfo() (*dto.SettingInfo, error) { + setting, err := settingRepo.GetList() + if err != nil { + return nil, constant.ErrRecordNotFound + } + settingMap := make(map[string]string) + for _, set := range setting { + settingMap[set.Key] = set.Value + } + var info dto.SettingInfo + arr, err := json.Marshal(settingMap) + if err != nil { + return nil, err + } + if err := json.Unmarshal(arr, &info); err != nil { + return nil, err + } + if info.ProxyPasswdKeep != constant.StatusEnable { + info.ProxyPasswd = "" + } else { + info.ProxyPasswd, _ = encrypt.StringDecrypt(info.ProxyPasswd) + } + + info.LocalTime = time.Now().Format("2006-01-02 15:04:05 MST -0700") + return &info, err +} + +func (u *SettingService) Update(key, value string) error { + switch key { + case "AppStoreLastModified": + exist, _ := settingRepo.Get(settingRepo.WithByKey("AppStoreLastModified")) + if exist.ID == 0 { + _ = settingRepo.Create("AppStoreLastModified", value) + return nil + } + } + + if err := settingRepo.Update(key, value); err != nil { + return err + } + + switch key { + case "ExpirationDays": + timeout, err := strconv.Atoi(value) + if err != nil { + return err + } + if err := settingRepo.Update("ExpirationTime", time.Now().AddDate(0, 0, timeout).Format(constant.DateTimeLayout)); err != nil { + return err + } + case "BindDomain": + if len(value) != 0 { + _ = global.SESSION.Clean() + } + case "UserName", "Password": + _ = global.SESSION.Clean() + + } + + return nil +} + +func (u *SettingService) LoadInterfaceAddr() ([]string, error) { + addrMap := make(map[string]struct{}) + addrs, err := net.InterfaceAddrs() + if err != nil { + return nil, err + } + for _, addr := range addrs { + ipNet, ok := addr.(*net.IPNet) + if ok && ipNet.IP.To16() != nil { + addrMap[ipNet.IP.String()] = struct{}{} + } + } + var data []string + for key := range addrMap { + data = append(data, key) + } + return data, nil +} + +func (u *SettingService) UpdateBindInfo(req dto.BindInfo) error { + if err := settingRepo.Update("Ipv6", req.Ipv6); err != nil { + return err + } + if err := settingRepo.Update("BindAddress", req.BindAddress); err != nil { + return err + } + go func() { + time.Sleep(1 * time.Second) + _, err := cmd.Exec("systemctl restart 1panel.service") + if err != nil { + global.LOG.Errorf("restart system with new bind info failed, err: %v", err) + } + }() + return nil +} + +func (u *SettingService) UpdateProxy(req dto.ProxyUpdate) error { + if err := settingRepo.Update("ProxyUrl", req.ProxyUrl); err != nil { + return err + } + if err := settingRepo.Update("ProxyType", req.ProxyType); err != nil { + return err + } + if err := settingRepo.Update("ProxyPort", req.ProxyPort); err != nil { + return err + } + if err := settingRepo.Update("ProxyUser", req.ProxyUser); err != nil { + return err + } + pass, _ := encrypt.StringEncrypt(req.ProxyPasswd) + if err := settingRepo.Update("ProxyPasswd", pass); err != nil { + return err + } + if err := settingRepo.Update("ProxyPasswdKeep", req.ProxyPasswdKeep); err != nil { + return err + } + return nil +} + +func (u *SettingService) UpdatePort(port uint) error { + if common.ScanPort(int(port)) { + return buserr.WithDetail(constant.ErrPortInUsed, port, nil) + } + // TODO 修改防火墙端口 + + if err := settingRepo.Update("ServerPort", strconv.Itoa(int(port))); err != nil { + return err + } + go func() { + time.Sleep(1 * time.Second) + _, err := cmd.Exec("systemctl restart 1panel.service") + if err != nil { + global.LOG.Errorf("restart system port failed, err: %v", err) + } + }() + return nil +} + +func (u *SettingService) UpdateSSL(c *gin.Context, req dto.SSLUpdate) error { + secretDir := path.Join(global.CONF.System.BaseDir, "1panel/secret") + if req.SSL == "disable" { + if err := settingRepo.Update("SSL", "disable"); err != nil { + return err + } + if err := settingRepo.Update("SSLType", "self"); err != nil { + return err + } + _ = os.Remove(path.Join(secretDir, "server.crt")) + _ = os.Remove(path.Join(secretDir, "server.key")) + sID, _ := c.Cookie(constant.SessionName) + c.SetCookie(constant.SessionName, sID, 0, "", "", false, true) + + go func() { + _, err := cmd.Exec("systemctl restart 1panel.service") + if err != nil { + global.LOG.Errorf("restart system failed, err: %v", err) + } + }() + return nil + } + if _, err := os.Stat(secretDir); err != nil && os.IsNotExist(err) { + if err = os.MkdirAll(secretDir, os.ModePerm); err != nil { + return err + } + } + if err := settingRepo.Update("SSLType", req.SSLType); err != nil { + return err + } + var ( + secret string + key string + ) + + switch req.SSLType { + case "import-paste": + secret = req.Cert + key = req.Key + case "import-local": + keyFile, err := os.ReadFile(req.Key) + if err != nil { + return err + } + key = string(keyFile) + certFile, err := os.ReadFile(req.Cert) + if err != nil { + return err + } + secret = string(certFile) + } + + if err := os.WriteFile(path.Join(secretDir, "server.crt.tmp"), []byte(secret), 0600); err != nil { + return err + } + if err := os.WriteFile(path.Join(secretDir, "server.key.tmp"), []byte(key), 0600); err != nil { + return err + } + if err := checkCertValid(); err != nil { + return err + } + if err := os.Rename(path.Join(secretDir, "server.crt.tmp"), path.Join(secretDir, "server.crt")); err != nil { + return err + } + if err := os.Rename(path.Join(secretDir, "server.key.tmp"), path.Join(secretDir, "server.key")); err != nil { + return err + } + if err := settingRepo.Update("SSL", req.SSL); err != nil { + return err + } + + sID, _ := c.Cookie(constant.SessionName) + c.SetCookie(constant.SessionName, sID, 0, "", "", true, true) + go func() { + time.Sleep(1 * time.Second) + _, err := cmd.Exec("systemctl restart 1panel.service") + if err != nil { + global.LOG.Errorf("restart system failed, err: %v", err) + } + }() + return nil +} + +func (u *SettingService) LoadFromCert() (*dto.SSLInfo, error) { + ssl, err := settingRepo.Get(settingRepo.WithByKey("SSL")) + if err != nil { + return nil, err + } + if ssl.Value == "disable" { + return &dto.SSLInfo{}, nil + } + sslType, err := settingRepo.Get(settingRepo.WithByKey("SSLType")) + if err != nil { + return nil, err + } + var data dto.SSLInfo + switch sslType.Value { + case "self": + data, err = loadInfoFromCert() + if err != nil { + return nil, err + } + case "import": + data, err = loadInfoFromCert() + if err != nil { + return nil, err + } + if _, err := os.Stat(path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt")); err != nil { + return nil, fmt.Errorf("load server.crt file failed, err: %v", err) + } + certFile, _ := os.ReadFile(path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt")) + data.Cert = string(certFile) + + if _, err := os.Stat(path.Join(global.CONF.System.BaseDir, "1panel/secret/server.key")); err != nil { + return nil, fmt.Errorf("load server.key file failed, err: %v", err) + } + keyFile, _ := os.ReadFile(path.Join(global.CONF.System.BaseDir, "1panel/secret/server.key")) + data.Key = string(keyFile) + case "select": + // TODO select ssl from website + } + return &data, nil +} + +func (u *SettingService) HandlePasswordExpired(c *gin.Context, old, new string) error { + setting, err := settingRepo.Get(settingRepo.WithByKey("Password")) + if err != nil { + return err + } + passwordFromDB, err := encrypt.StringDecrypt(setting.Value) + if err != nil { + return err + } + if passwordFromDB == old { + newPassword, err := encrypt.StringEncrypt(new) + if err != nil { + return err + } + if err := settingRepo.Update("Password", newPassword); err != nil { + return err + } + + expiredSetting, err := settingRepo.Get(settingRepo.WithByKey("ExpirationDays")) + if err != nil { + return err + } + timeout, _ := strconv.Atoi(expiredSetting.Value) + if err := settingRepo.Update("ExpirationTime", time.Now().AddDate(0, 0, timeout).Format(constant.DateTimeLayout)); err != nil { + return err + } + return nil + } + return constant.ErrInitialPassword +} + +func (u *SettingService) UpdatePassword(c *gin.Context, old, new string) error { + if err := u.HandlePasswordExpired(c, old, new); err != nil { + return err + } + _ = global.SESSION.Clean() + return nil +} + +func loadInfoFromCert() (dto.SSLInfo, error) { + var info dto.SSLInfo + certFile := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt") + if _, err := os.Stat(certFile); err != nil { + return info, err + } + certData, err := os.ReadFile(certFile) + if err != nil { + return info, err + } + certBlock, _ := pem.Decode(certData) + if certBlock == nil { + return info, err + } + certObj, err := x509.ParseCertificate(certBlock.Bytes) + if err != nil { + return info, err + } + var domains []string + if len(certObj.IPAddresses) != 0 { + for _, ip := range certObj.IPAddresses { + domains = append(domains, ip.String()) + } + } + if len(certObj.DNSNames) != 0 { + domains = append(domains, certObj.DNSNames...) + } + return dto.SSLInfo{ + Domain: strings.Join(domains, ","), + Timeout: certObj.NotAfter.Format(constant.DateTimeLayout), + RootPath: path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt"), + }, nil +} + +func checkCertValid() error { + certificate, err := os.ReadFile(path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt.tmp")) + if err != nil { + return err + } + key, err := os.ReadFile(path.Join(global.CONF.System.BaseDir, "1panel/secret/server.key.tmp")) + if err != nil { + return err + } + if _, err = tls.X509KeyPair(certificate, key); err != nil { + return err + } + certBlock, _ := pem.Decode(certificate) + if certBlock == nil { + return err + } + if _, err := x509.ParseCertificate(certBlock.Bytes); err != nil { + return err + } + + return nil +} diff --git a/core/app/service/upgrade.go b/core/app/service/upgrade.go new file mode 100644 index 000000000..3e9e5b8c2 --- /dev/null +++ b/core/app/service/upgrade.go @@ -0,0 +1,352 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "path" + "strconv" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/common" + "github.com/1Panel-dev/1Panel/core/utils/files" + httpUtil "github.com/1Panel-dev/1Panel/core/utils/http" +) + +type UpgradeService struct{} + +type IUpgradeService interface { + Upgrade(req dto.Upgrade) error + LoadNotes(req dto.Upgrade) (string, error) + SearchUpgrade() (*dto.UpgradeInfo, error) +} + +func NewIUpgradeService() IUpgradeService { + return &UpgradeService{} +} + +func (u *UpgradeService) SearchUpgrade() (*dto.UpgradeInfo, error) { + var upgrade dto.UpgradeInfo + currentVersion, err := settingRepo.Get(settingRepo.WithByKey("SystemVersion")) + if err != nil { + return nil, err + } + DeveloperMode, err := settingRepo.Get(settingRepo.WithByKey("DeveloperMode")) + if err != nil { + return nil, err + } + + upgrade.TestVersion, upgrade.NewVersion, upgrade.LatestVersion = u.loadVersionByMode(DeveloperMode.Value, currentVersion.Value) + var itemVersion string + if len(upgrade.LatestVersion) != 0 { + itemVersion = upgrade.LatestVersion + } + if len(upgrade.NewVersion) != 0 { + itemVersion = upgrade.NewVersion + } + if (global.CONF.System.Mode == "dev" || DeveloperMode.Value == "enable") && len(upgrade.TestVersion) != 0 { + itemVersion = upgrade.TestVersion + } + if len(itemVersion) == 0 { + return &upgrade, nil + } + mode := global.CONF.System.Mode + if strings.Contains(itemVersion, "beta") { + mode = "beta" + } + notes, err := u.loadReleaseNotes(fmt.Sprintf("%s/%s/%s/release/1panel-%s-release-notes", global.CONF.System.RepoUrl, mode, itemVersion, itemVersion)) + if err != nil { + return nil, fmt.Errorf("load releases-notes of version %s failed, err: %v", itemVersion, err) + } + upgrade.ReleaseNote = notes + return &upgrade, nil +} + +func (u *UpgradeService) LoadNotes(req dto.Upgrade) (string, error) { + mode := global.CONF.System.Mode + if strings.Contains(req.Version, "beta") { + mode = "beta" + } + notes, err := u.loadReleaseNotes(fmt.Sprintf("%s/%s/%s/release/1panel-%s-release-notes", global.CONF.System.RepoUrl, mode, req.Version, req.Version)) + if err != nil { + return "", fmt.Errorf("load releases-notes of version %s failed, err: %v", req.Version, err) + } + return notes, nil +} + +func (u *UpgradeService) Upgrade(req dto.Upgrade) error { + global.LOG.Info("start to upgrade now...") + timeStr := time.Now().Format(constant.DateTimeSlimLayout) + rootDir := path.Join(global.CONF.System.TmpDir, fmt.Sprintf("upgrade/upgrade_%s/downloads", timeStr)) + originalDir := path.Join(global.CONF.System.TmpDir, fmt.Sprintf("upgrade/upgrade_%s/original", timeStr)) + if err := os.MkdirAll(rootDir, os.ModePerm); err != nil { + return err + } + if err := os.MkdirAll(originalDir, os.ModePerm); err != nil { + return err + } + itemArch, err := loadArch() + if err != nil { + return err + } + + mode := global.CONF.System.Mode + if strings.Contains(req.Version, "beta") { + mode = "beta" + } + downloadPath := fmt.Sprintf("%s/%s/%s/release", global.CONF.System.RepoUrl, mode, req.Version) + fileName := fmt.Sprintf("1panel-%s-%s-%s.tar.gz", req.Version, "linux", itemArch) + _ = settingRepo.Update("SystemStatus", "Upgrading") + go func() { + if err := files.DownloadFileWithProxy(downloadPath+"/"+fileName, rootDir+"/"+fileName); err != nil { + global.LOG.Errorf("download service file failed, err: %v", err) + _ = settingRepo.Update("SystemStatus", "Free") + return + } + global.LOG.Info("download all file successful!") + defer func() { + _ = os.Remove(rootDir) + }() + if err := files.HandleUnTar(rootDir+"/"+fileName, rootDir, ""); err != nil { + global.LOG.Errorf("decompress file failed, err: %v", err) + _ = settingRepo.Update("SystemStatus", "Free") + return + } + tmpDir := rootDir + "/" + strings.ReplaceAll(fileName, ".tar.gz", "") + + if err := u.handleBackup(originalDir); err != nil { + global.LOG.Errorf("handle backup original file failed, err: %v", err) + _ = settingRepo.Update("SystemStatus", "Free") + return + } + global.LOG.Info("backup original data successful, now start to upgrade!") + + if err := files.CopyFile(path.Join(tmpDir, "1panel"), "/usr/local/bin"); err != nil { + global.LOG.Errorf("upgrade 1panel failed, err: %v", err) + u.handleRollback(originalDir, 1) + return + } + + if err := files.CopyFile(path.Join(tmpDir, "1pctl"), "/usr/local/bin"); err != nil { + global.LOG.Errorf("upgrade 1pctl failed, err: %v", err) + u.handleRollback(originalDir, 2) + return + } + if _, err := cmd.Execf("sed -i -e 's#BASE_DIR=.*#BASE_DIR=%s#g' /usr/local/bin/1pctl", global.CONF.System.BaseDir); err != nil { + global.LOG.Errorf("upgrade basedir in 1pctl failed, err: %v", err) + u.handleRollback(originalDir, 2) + return + } + + if err := files.CopyFile(path.Join(tmpDir, "1panel.service"), "/etc/systemd/system"); err != nil { + global.LOG.Errorf("upgrade 1panel.service failed, err: %v", err) + u.handleRollback(originalDir, 3) + return + } + + global.LOG.Info("upgrade successful!") + go writeLogs(req.Version) + _ = settingRepo.Update("SystemVersion", req.Version) + _ = settingRepo.Update("SystemStatus", "Free") + checkPointOfWal() + _, _ = cmd.ExecWithTimeOut("systemctl daemon-reload && systemctl restart 1panel.service", 1*time.Minute) + }() + return nil +} + +func (u *UpgradeService) handleBackup(originalDir string) error { + if err := files.CopyFile("/usr/local/bin/1panel", originalDir); err != nil { + return err + } + if err := files.CopyFile("/usr/local/bin/1pctl", originalDir); err != nil { + return err + } + if err := files.CopyFile("/etc/systemd/system/1panel.service", originalDir); err != nil { + return err + } + checkPointOfWal() + if err := files.HandleTar(path.Join(global.CONF.System.BaseDir, "1panel/db"), originalDir, "db.tar.gz", "db/1Panel.db-*", ""); err != nil { + return err + } + return nil +} + +func (u *UpgradeService) handleRollback(originalDir string, errStep int) { + _ = settingRepo.Update("SystemStatus", "Free") + + checkPointOfWal() + if _, err := os.Stat(path.Join(originalDir, "1Panel.db")); err == nil { + if err := files.CopyFile(path.Join(originalDir, "1Panel.db"), global.CONF.System.DbPath); err != nil { + global.LOG.Errorf("rollback 1panel db failed, err: %v", err) + } + } + if _, err := os.Stat(path.Join(originalDir, "db.tar.gz")); err == nil { + if err := files.HandleUnTar(path.Join(originalDir, "db.tar.gz"), global.CONF.System.DbPath, ""); err != nil { + global.LOG.Errorf("rollback 1panel db failed, err: %v", err) + } + } + if err := files.CopyFile(path.Join(originalDir, "1panel"), "/usr/local/bin"); err != nil { + global.LOG.Errorf("rollback 1pctl failed, err: %v", err) + } + if errStep == 1 { + return + } + if err := files.CopyFile(path.Join(originalDir, "1pctl"), "/usr/local/bin"); err != nil { + global.LOG.Errorf("rollback 1panel failed, err: %v", err) + } + if errStep == 2 { + return + } + if err := files.CopyFile(path.Join(originalDir, "1panel.service"), "/etc/systemd/system"); err != nil { + global.LOG.Errorf("rollback 1panel failed, err: %v", err) + } +} + +func (u *UpgradeService) loadVersionByMode(developer, currentVersion string) (string, string, string) { + var current, latest string + if global.CONF.System.Mode == "dev" { + betaVersionLatest := u.loadVersion(true, currentVersion, "beta") + devVersionLatest := u.loadVersion(true, currentVersion, "dev") + if common.ComparePanelVersion(betaVersionLatest, devVersionLatest) { + return betaVersionLatest, "", "" + } + return devVersionLatest, "", "" + } + + betaVersionLatest := "" + latest = u.loadVersion(true, currentVersion, "stable") + current = u.loadVersion(false, currentVersion, "stable") + if developer == "enable" { + betaVersionLatest = u.loadVersion(true, currentVersion, "beta") + } + if current != latest { + return betaVersionLatest, current, latest + } + + versionPart := strings.Split(current, ".") + if len(versionPart) < 3 { + return betaVersionLatest, current, latest + } + num, _ := strconv.Atoi(versionPart[1]) + if num == 0 { + return betaVersionLatest, current, latest + } + if num >= 10 { + if current[:6] == currentVersion[:6] { + return betaVersionLatest, current, "" + } + return betaVersionLatest, "", latest + } + if current[:5] == currentVersion[:5] { + return betaVersionLatest, current, "" + } + return betaVersionLatest, "", latest +} + +func (u *UpgradeService) loadVersion(isLatest bool, currentVersion, mode string) string { + path := fmt.Sprintf("%s/%s/latest", global.CONF.System.RepoUrl, mode) + if !isLatest { + path = fmt.Sprintf("%s/%s/latest.current", global.CONF.System.RepoUrl, mode) + } + _, latestVersionRes, err := httpUtil.HandleGet(path, http.MethodGet, constant.TimeOut20s) + if err != nil { + global.LOG.Errorf("load latest version from oss failed, err: %v", err) + return "" + } + version := string(latestVersionRes) + if strings.Contains(version, "<") { + global.LOG.Errorf("load latest version from oss failed, err: %v", version) + return "" + } + if isLatest { + return u.checkVersion(version, currentVersion) + } + + versionMap := make(map[string]string) + if err := json.Unmarshal(latestVersionRes, &versionMap); err != nil { + global.LOG.Errorf("load latest version from oss failed (error unmarshal), err: %v", err) + return "" + } + + versionPart := strings.Split(currentVersion, ".") + if len(versionPart) < 3 { + global.LOG.Errorf("current version is error format: %s", currentVersion) + return "" + } + num, _ := strconv.Atoi(versionPart[1]) + if num == 0 { + global.LOG.Errorf("current version is error format: %s", currentVersion) + return "" + } + if num >= 10 { + if version, ok := versionMap[currentVersion[0:5]]; ok { + return u.checkVersion(version, currentVersion) + } + return "" + } + if version, ok := versionMap[currentVersion[0:4]]; ok { + return u.checkVersion(version, currentVersion) + } + return "" +} + +func (u *UpgradeService) checkVersion(v2, v1 string) string { + addSuffix := false + if !strings.Contains(v1, "-") { + v1 = v1 + "-lts" + } + if !strings.Contains(v2, "-") { + addSuffix = true + v2 = v2 + "-lts" + } + if common.ComparePanelVersion(v2, v1) { + if addSuffix { + return strings.TrimSuffix(v2, "-lts") + } + return v2 + } + return "" +} + +func (u *UpgradeService) loadReleaseNotes(path string) (string, error) { + _, releaseNotes, err := httpUtil.HandleGet(path, http.MethodGet, constant.TimeOut20s) + if err != nil { + return "", err + } + return string(releaseNotes), nil +} + +func loadArch() (string, error) { + std, err := cmd.Exec("uname -a") + if err != nil { + return "", fmt.Errorf("std: %s, err: %s", std, err.Error()) + } + if strings.Contains(std, "x86_64") { + return "amd64", nil + } + if strings.Contains(std, "arm64") || strings.Contains(std, "aarch64") { + return "arm64", nil + } + if strings.Contains(std, "armv7l") { + return "armv7", nil + } + if strings.Contains(std, "ppc64le") { + return "ppc64le", nil + } + if strings.Contains(std, "s390x") { + return "s390x", nil + } + return "", fmt.Errorf("unsupported such arch: %s", std) +} + +func checkPointOfWal() { + if err := global.DB.Exec("PRAGMA wal_checkpoint(TRUNCATE);").Error; err != nil { + global.LOG.Errorf("handle check point failed, err: %v", err) + } +} diff --git a/core/buserr/errors.go b/core/buserr/errors.go new file mode 100644 index 000000000..a71020dd0 --- /dev/null +++ b/core/buserr/errors.go @@ -0,0 +1,55 @@ +package buserr + +import ( + "github.com/1Panel-dev/1Panel/core/i18n" + "github.com/pkg/errors" +) + +type BusinessError struct { + Msg string + Detail interface{} + Map map[string]interface{} + Err error +} + +func (e BusinessError) Error() string { + content := "" + if e.Detail != nil { + content = i18n.GetErrMsg(e.Msg, map[string]interface{}{"detail": e.Detail}) + } else if e.Map != nil { + content = i18n.GetErrMsg(e.Msg, e.Map) + } else { + content = i18n.GetErrMsg(e.Msg, nil) + } + if content == "" { + if e.Err != nil { + return e.Err.Error() + } + return errors.New(e.Msg).Error() + } + return content +} + +func New(Key string) BusinessError { + return BusinessError{ + Msg: Key, + Detail: nil, + Err: nil, + } +} + +func WithDetail(Key string, detail interface{}, err error) BusinessError { + return BusinessError{ + Msg: Key, + Detail: detail, + Err: err, + } +} + +func WithMap(Key string, maps map[string]interface{}, err error) BusinessError { + return BusinessError{ + Msg: Key, + Map: maps, + Err: err, + } +} diff --git a/core/buserr/multi_err.go b/core/buserr/multi_err.go new file mode 100644 index 000000000..bf0c875ce --- /dev/null +++ b/core/buserr/multi_err.go @@ -0,0 +1,23 @@ +package buserr + +import ( + "bytes" + "fmt" + "sort" +) + +type MultiErr map[string]error + +func (e MultiErr) Error() string { + var keys []string + for key := range e { + keys = append(keys, key) + } + sort.Strings(keys) + + buffer := bytes.NewBufferString("") + for _, key := range keys { + buffer.WriteString(fmt.Sprintf("[%s] %s\n", key, e[key])) + } + return buffer.String() +} diff --git a/core/cmd/server/cmd/listen-ip.go b/core/cmd/server/cmd/listen-ip.go new file mode 100644 index 000000000..c0168878f --- /dev/null +++ b/core/cmd/server/cmd/listen-ip.go @@ -0,0 +1,60 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func init() { + RootCmd.AddCommand(listenCmd) + listenCmd.AddCommand(listenIpv4Cmd) + listenCmd.AddCommand(listenIpv6Cmd) +} + +var listenCmd = &cobra.Command{ + Use: "listen-ip", + Short: "切换监听 IP", +} + +var listenIpv4Cmd = &cobra.Command{ + Use: "ipv4", + Short: "监听 IPv4", + RunE: func(cmd *cobra.Command, args []string) error { + return updateBindInfo("ipv4") + }, +} +var listenIpv6Cmd = &cobra.Command{ + Use: "ipv6", + Short: "监听 IPv6", + RunE: func(cmd *cobra.Command, args []string) error { + return updateBindInfo("ipv6") + }, +} + +func updateBindInfo(protocol string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl listen-ip ipv6 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + ipv6 := "disable" + tcp := "tcp4" + address := "0.0.0.0" + if protocol == "ipv6" { + ipv6 = "enable" + tcp = "tcp6" + address = "::" + } + if err := setSettingByKey(db, "Ipv6", ipv6); err != nil { + return err + } + if err := setSettingByKey(db, "BindAddress", address); err != nil { + return err + } + fmt.Printf("切换成功!已切换至监听 %s [%s]", tcp, address) + return nil +} diff --git a/core/cmd/server/cmd/reset.go b/core/cmd/server/cmd/reset.go new file mode 100644 index 000000000..d398b967c --- /dev/null +++ b/core/cmd/server/cmd/reset.go @@ -0,0 +1,102 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func init() { + RootCmd.AddCommand(resetCmd) + resetCmd.AddCommand(resetMFACmd) + resetCmd.AddCommand(resetSSLCmd) + resetCmd.AddCommand(resetEntranceCmd) + resetCmd.AddCommand(resetBindIpsCmd) + resetCmd.AddCommand(resetDomainCmd) +} + +var resetCmd = &cobra.Command{ + Use: "reset", + Short: "重置系统信息", +} + +var resetMFACmd = &cobra.Command{ + Use: "mfa", + Short: "取消 1Panel 两步验证", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl reset mfa 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + + return setSettingByKey(db, "MFAStatus", "disable") + }, +} +var resetSSLCmd = &cobra.Command{ + Use: "https", + Short: "取消 1Panel https 方式登录", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl reset https 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + + return setSettingByKey(db, "SSL", "disable") + }, +} +var resetEntranceCmd = &cobra.Command{ + Use: "entrance", + Short: "取消 1Panel 安全入口", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl reset entrance 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + + return setSettingByKey(db, "SecurityEntrance", "") + }, +} +var resetBindIpsCmd = &cobra.Command{ + Use: "ips", + Short: "取消 1Panel 授权 IP 限制", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl reset ips 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + + return setSettingByKey(db, "AllowIPs", "") + }, +} +var resetDomainCmd = &cobra.Command{ + Use: "domain", + Short: "取消 1Panel 访问域名绑定", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl reset domain 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + + return setSettingByKey(db, "BindDomain", "") + }, +} diff --git a/core/cmd/server/cmd/restore.go b/core/cmd/server/cmd/restore.go new file mode 100644 index 000000000..d12e669d4 --- /dev/null +++ b/core/cmd/server/cmd/restore.go @@ -0,0 +1,122 @@ +package cmd + +import ( + "fmt" + "os" + "path" + "sort" + "strings" + "time" + + cmdUtils "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/files" + "github.com/pkg/errors" + + "github.com/spf13/cobra" +) + +func init() { + RootCmd.AddCommand(restoreCmd) +} + +var restoreCmd = &cobra.Command{ + Use: "restore", + Short: "回滚 1Panel 服务及数据", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl restore 或者切换到 root 用户") + return nil + } + stdout, err := cmdUtils.Exec("grep '^BASE_DIR=' /usr/local/bin/1pctl | cut -d'=' -f2") + if err != nil { + return fmt.Errorf("handle load `BASE_DIR` failed, err: %v", err) + } + baseDir := strings.ReplaceAll(stdout, "\n", "") + upgradeDir := path.Join(baseDir, "1panel", "tmp", "upgrade") + + tmpPath, err := loadRestorePath(upgradeDir) + if err != nil { + return err + } + if tmpPath == "暂无可回滚文件" { + fmt.Println("暂无可回滚文件") + return nil + } + tmpPath = path.Join(upgradeDir, tmpPath, "original") + fmt.Printf("(0/4) 开始从 %s 目录回滚 1Panel 服务及数据... \n", tmpPath) + + if err := files.CopyFile(path.Join(tmpPath, "1panel"), "/usr/local/bin"); err != nil { + return err + } + fmt.Println("(1/4) 1panel 二进制回滚成功") + if err := files.CopyFile(path.Join(tmpPath, "1pctl"), "/usr/local/bin"); err != nil { + return err + } + fmt.Println("(2/4) 1panel 脚本回滚成功") + if err := files.CopyFile(path.Join(tmpPath, "1panel.service"), "/etc/systemd/system"); err != nil { + return err + } + fmt.Println("(3/4) 1panel 服务回滚成功") + checkPointOfWal() + if _, err := os.Stat(path.Join(tmpPath, "1Panel.db")); err == nil { + if err := files.CopyFile(path.Join(tmpPath, "1Panel.db"), path.Join(baseDir, "1panel/db")); err != nil { + return err + } + } + if _, err := os.Stat(path.Join(tmpPath, "db.tar.gz")); err == nil { + if err := handleUnTar(path.Join(tmpPath, "db.tar.gz"), path.Join(baseDir, "1panel")); err != nil { + return err + } + } + fmt.Printf("(4/4) 1panel 数据回滚成功 \n\n") + + fmt.Println("回滚成功!正在重启服务,请稍候...") + return nil + }, +} + +func checkPointOfWal() { + db, err := loadDBConn() + if err != nil { + return + } + _ = db.Exec("PRAGMA wal_checkpoint(TRUNCATE);").Error +} + +func loadRestorePath(upgradeDir string) (string, error) { + if _, err := os.Stat(upgradeDir); err != nil && os.IsNotExist(err) { + return "暂无可回滚文件", nil + } + files, err := os.ReadDir(upgradeDir) + if err != nil { + return "", err + } + var folders []string + for _, file := range files { + if file.IsDir() { + folders = append(folders, file.Name()) + } + } + if len(folders) == 0 { + return "暂无可回滚文件", nil + } + sort.Slice(folders, func(i, j int) bool { + return folders[i] > folders[j] + }) + return folders[0], nil +} + +func handleUnTar(sourceFile, targetDir string) error { + if _, err := os.Stat(targetDir); err != nil && os.IsNotExist(err) { + if err = os.MkdirAll(targetDir, os.ModePerm); err != nil { + return err + } + } + + commands := fmt.Sprintf("tar zxvfC %s %s", sourceFile, targetDir) + stdout, err := cmdUtils.ExecWithTimeOut(commands, 20*time.Second) + if err != nil { + return errors.New(stdout) + } + return nil +} diff --git a/core/cmd/server/cmd/root.go b/core/cmd/server/cmd/root.go new file mode 100644 index 000000000..7063cac42 --- /dev/null +++ b/core/cmd/server/cmd/root.go @@ -0,0 +1,80 @@ +package cmd + +import ( + "fmt" + "os/user" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/server" + cmdUtils "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/glebarez/sqlite" + "github.com/spf13/cobra" + "gorm.io/gorm" +) + +func init() {} + +var RootCmd = &cobra.Command{ + Use: "1panel", + Short: "1Panel ,一款现代化的 Linux 面板", + RunE: func(cmd *cobra.Command, args []string) error { + server.Start() + return nil + }, +} + +type setting struct { + ID uint `gorm:"primarykey;AUTO_INCREMENT" json:"id"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + Key string `json:"key" gorm:"type:varchar(256);not null;"` + Value string `json:"value" gorm:"type:varchar(256)"` + About string `json:"about" gorm:"type:longText"` +} + +func loadDBConn() (*gorm.DB, error) { + stdout, err := cmdUtils.Exec("grep '^BASE_DIR=' /usr/local/bin/1pctl | cut -d'=' -f2") + if err != nil { + return nil, fmt.Errorf("handle load `BASE_DIR` failed, err: %v", err) + } + baseDir := strings.ReplaceAll(stdout, "\n", "") + if len(baseDir) == 0 { + return nil, fmt.Errorf("error `BASE_DIR` find in /usr/local/bin/1pctl \n") + } + if strings.HasSuffix(baseDir, "/") { + baseDir = baseDir[:strings.LastIndex(baseDir, "/")] + } + + db, err := gorm.Open(sqlite.Open(baseDir+"/1panel/db/1Panel.db"), &gorm.Config{}) + if err != nil { + return nil, fmt.Errorf("init my db conn failed, err: %v \n", err) + } + return db, nil +} + +func getSettingByKey(db *gorm.DB, key string) string { + var setting setting + _ = db.Where("key = ?", key).First(&setting).Error + return setting.Value +} + +type LoginLog struct{} + +func isDefault(db *gorm.DB) bool { + logCount := int64(0) + _ = db.Model(&LoginLog{}).Where("status = ?", "Success").Count(&logCount).Error + return logCount == 0 +} + +func setSettingByKey(db *gorm.DB, key, value string) error { + return db.Model(&setting{}).Where("key = ?", key).Updates(map[string]interface{}{"value": value}).Error +} + +func isRoot() bool { + currentUser, err := user.Current() + if err != nil { + return false + } + return currentUser.Uid == "0" +} diff --git a/core/cmd/server/cmd/update.go b/core/cmd/server/cmd/update.go new file mode 100644 index 000000000..9b9709ec6 --- /dev/null +++ b/core/cmd/server/cmd/update.go @@ -0,0 +1,240 @@ +package cmd + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strconv" + "strings" + "unicode" + + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/common" + "github.com/1Panel-dev/1Panel/core/utils/encrypt" + "github.com/spf13/cobra" + "golang.org/x/term" +) + +func init() { + RootCmd.AddCommand(updateCmd) + updateCmd.AddCommand(updateUserName) + updateCmd.AddCommand(updatePassword) + updateCmd.AddCommand(updatePort) +} + +var updateCmd = &cobra.Command{ + Use: "update", + Short: "修改面板信息", +} + +var updateUserName = &cobra.Command{ + Use: "username", + Short: "修改面板用户", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl update username 或者切换到 root 用户") + return nil + } + username() + return nil + }, +} +var updatePassword = &cobra.Command{ + Use: "password", + Short: "修改面板密码", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl update password 或者切换到 root 用户") + return nil + } + password() + return nil + }, +} +var updatePort = &cobra.Command{ + Use: "port", + Short: "修改面板端口", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl update port 或者切换到 root 用户") + return nil + } + port() + return nil + }, +} + +func username() { + reader := bufio.NewReader(os.Stdin) + fmt.Print("修改面板用户: ") + newUsername, _ := reader.ReadString('\n') + newUsername = strings.Trim(newUsername, "\n") + if len(newUsername) == 0 { + fmt.Println("错误:输入面板用户为空!") + return + } + if strings.Contains(newUsername, " ") { + fmt.Println("错误:输入面板用户中包含空格字符!") + return + } + result, err := regexp.MatchString("^[a-zA-Z0-9_\u4e00-\u9fa5]{3,30}$", newUsername) + if !result || err != nil { + fmt.Println("错误:输入面板用户错误!仅支持英文、中文、数字和_,长度3-30") + return + } + + db, err := loadDBConn() + if err != nil { + fmt.Printf("错误:初始化数据库连接失败,%v\n", err) + return + } + if err := setSettingByKey(db, "UserName", newUsername); err != nil { + fmt.Printf("错误:面板用户修改失败,%v\n", err) + return + } + + fmt.Printf("修改成功!\n\n") + fmt.Printf("面板用户:%s\n", newUsername) +} + +func password() { + fmt.Print("修改面板密码:") + bytePassword, err := term.ReadPassword(int(os.Stdin.Fd())) + if err != nil { + fmt.Printf("\n错误:面板密码信息读取错误,%v\n", err) + return + } + newPassword := string(bytePassword) + newPassword = strings.Trim(newPassword, "\n") + + if len(newPassword) == 0 { + fmt.Println("\n错误:输入面板密码为空!") + return + } + if strings.Contains(newPassword, " ") { + fmt.Println("\n错误:输入面板密码中包含空格字符!") + return + } + db, err := loadDBConn() + if err != nil { + fmt.Printf("\n错误:初始化数据库连接失败,%v\n", err) + return + } + complexSetting := getSettingByKey(db, "ComplexityVerification") + if complexSetting == "enable" { + if isValidPassword("newPassword") { + fmt.Println("\n错误:面板密码仅支持字母、数字、特殊字符(!@#$%*_,.?),长度 8-30 位!") + return + } + } + if len(newPassword) < 6 { + fmt.Println("错误:请输入 6 位以上密码!") + return + } + + fmt.Print("\n确认密码:") + byteConfirmPassword, err := term.ReadPassword(int(os.Stdin.Fd())) + if err != nil { + fmt.Printf("\n错误:面板密码信息读取错误,%v\n", err) + return + } + confirmPassword := string(byteConfirmPassword) + confirmPassword = strings.Trim(confirmPassword, "\n") + + if newPassword != confirmPassword { + fmt.Printf("\n错误:两次密码不匹配,请检查后重试!,%v\n", err) + return + } + + p := "" + encryptSetting := getSettingByKey(db, "EncryptKey") + if len(encryptSetting) == 16 { + global.CONF.System.EncryptKey = encryptSetting + p, _ = encrypt.StringEncrypt(newPassword) + } else { + p = newPassword + } + if err := setSettingByKey(db, "Password", p); err != nil { + fmt.Printf("\n错误:面板密码修改失败,%v\n", err) + return + } + username := getSettingByKey(db, "UserName") + + fmt.Printf("\n修改成功!\n\n") + fmt.Printf("面板用户:%s\n", username) + fmt.Printf("面板密码:%s\n", string(newPassword)) +} + +func port() { + reader := bufio.NewReader(os.Stdin) + fmt.Print("修改面板端口:") + + newPortStr, _ := reader.ReadString('\n') + newPortStr = strings.Trim(newPortStr, "\n") + newPort, err := strconv.Atoi(strings.TrimSpace(newPortStr)) + if err != nil || newPort < 1 || newPort > 65535 { + fmt.Println("错误:输入的端口号必须在 1 到 65535 之间!") + return + } + if common.ScanPort(newPort) { + fmt.Println("错误:该端口号正被占用,请检查后重试!") + return + } + db, err := loadDBConn() + if err != nil { + fmt.Printf("错误:初始化数据库连接失败,%v\n", err) + return + } + if err := setSettingByKey(db, "ServerPort", newPortStr); err != nil { + fmt.Printf("错误:面板端口修改失败,%v\n", err) + return + } + + fmt.Printf("修改成功!\n\n") + fmt.Printf("面板端口:%s\n", newPortStr) + + std, err := cmd.Exec("1pctl restart") + if err != nil { + fmt.Println(std) + } +} +func isValidPassword(password string) bool { + numCount := 0 + alphaCount := 0 + specialCount := 0 + + for _, char := range password { + switch { + case unicode.IsDigit(char): + numCount++ + case unicode.IsLetter(char): + alphaCount++ + case isSpecialChar(char): + specialCount++ + } + } + + if len(password) < 8 && len(password) > 30 { + return false + } + if (numCount == 0 && alphaCount == 0) || (alphaCount == 0 && specialCount == 0) || (numCount == 0 && specialCount == 0) { + return false + } + return true +} + +func isSpecialChar(char rune) bool { + specialChars := "!@#$%*_,.?" + return unicode.IsPunct(char) && contains(specialChars, char) +} + +func contains(specialChars string, char rune) bool { + for _, c := range specialChars { + if c == char { + return true + } + } + return false +} diff --git a/core/cmd/server/cmd/user-info.go b/core/cmd/server/cmd/user-info.go new file mode 100644 index 000000000..991a18749 --- /dev/null +++ b/core/cmd/server/cmd/user-info.go @@ -0,0 +1,56 @@ +package cmd + +import ( + "fmt" + + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/encrypt" + "github.com/spf13/cobra" +) + +func init() { + RootCmd.AddCommand(userinfoCmd) +} + +var userinfoCmd = &cobra.Command{ + Use: "user-info", + Short: "获取面板信息", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl user-info 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return fmt.Errorf("init my db conn failed, err: %v \n", err) + } + user := getSettingByKey(db, "UserName") + pass := "********" + if isDefault(db) { + encryptSetting := getSettingByKey(db, "EncryptKey") + pass = getSettingByKey(db, "Password") + if len(encryptSetting) == 16 { + global.CONF.System.EncryptKey = encryptSetting + pass, _ = encrypt.StringDecrypt(pass) + } + } + port := getSettingByKey(db, "ServerPort") + ssl := getSettingByKey(db, "SSL") + entrance := getSettingByKey(db, "SecurityEntrance") + address := getSettingByKey(db, "SystemIP") + + protocol := "http" + if ssl == "enable" { + protocol = "https" + } + if address == "" { + address = "$LOCAL_IP" + } + + fmt.Printf("面板地址: %s://%s:%s/%s \n", protocol, address, port, entrance) + fmt.Println("面板用户: ", user) + fmt.Println("面板密码: ", pass) + fmt.Println("提示:修改密码可执行命令:1pctl update password") + return nil + }, +} diff --git a/core/cmd/server/cmd/version.go b/core/cmd/server/cmd/version.go new file mode 100644 index 000000000..0559573c3 --- /dev/null +++ b/core/cmd/server/cmd/version.go @@ -0,0 +1,40 @@ +package cmd + +import ( + "fmt" + + "github.com/1Panel-dev/1Panel/core/cmd/server/conf" + "github.com/1Panel-dev/1Panel/core/configs" + "gopkg.in/yaml.v3" + + "github.com/spf13/cobra" +) + +func init() { + RootCmd.AddCommand(versionCmd) +} + +var versionCmd = &cobra.Command{ + Use: "version", + Short: "获取系统版本信息", + RunE: func(cmd *cobra.Command, args []string) error { + if !isRoot() { + fmt.Println("请使用 sudo 1pctl version 或者切换到 root 用户") + return nil + } + db, err := loadDBConn() + if err != nil { + return err + } + version := getSettingByKey(db, "SystemVersion") + + fmt.Printf("1panel version: %s\n", version) + config := configs.ServerConfig{} + if err := yaml.Unmarshal(conf.AppYaml, &config); err != nil { + return fmt.Errorf("unmarshal conf.App.Yaml failed, errL %v", err) + } else { + fmt.Printf("mode: %s\n", config.System.Mode) + } + return nil + }, +} diff --git a/core/cmd/server/conf/app.yaml b/core/cmd/server/conf/app.yaml new file mode 100644 index 000000000..0da0e5163 --- /dev/null +++ b/core/cmd/server/conf/app.yaml @@ -0,0 +1,17 @@ +system: + db_file: 1Panel.db + base_dir: /opt + mode: dev + repo_url: https://resource.fit2cloud.com/1panel/package + app_repo: https://apps-assets.fit2cloud.com + is_demo: false + port: 9999 + username: admin + password: admin123 + +log: + level: debug + time_zone: Asia/Shanghai + log_name: 1Panel + log_suffix: .log + max_backup: 10 diff --git a/core/cmd/server/conf/conf.go b/core/cmd/server/conf/conf.go new file mode 100644 index 000000000..6654d8bcf --- /dev/null +++ b/core/cmd/server/conf/conf.go @@ -0,0 +1,6 @@ +package conf + +import _ "embed" + +//go:embed app.yaml +var AppYaml []byte diff --git a/core/cmd/server/docs/docs.go b/core/cmd/server/docs/docs.go new file mode 100644 index 000000000..b004a49f5 --- /dev/null +++ b/core/cmd/server/docs/docs.go @@ -0,0 +1,23464 @@ +// Code generated by swaggo/swag. DO NOT EDIT. + +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "termsOfService": "http://swagger.io/terms/", + "contact": {}, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/apps/:key": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 key 获取应用信息", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app by key", + "parameters": [ + { + "type": "string", + "description": "app key", + "name": "key", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppDTO" + } + } + } + } + }, + "/apps/checkupdate": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用更新版本", + "tags": [ + "App" + ], + "summary": "Get app list update", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/apps/detail/:appId/:version/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 appid 获取应用详情", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app detail by appid", + "parameters": [ + { + "type": "integer", + "description": "app id", + "name": "appId", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "app 版本", + "name": "version", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "app 类型", + "name": "version", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppDetailDTO" + } + } + } + } + }, + "/apps/details/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 获取应用详情", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Get app detail by id", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "appId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppDetailDTO" + } + } + } + } + }, + "/apps/ignored": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取忽略的应用版本", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Get Ignore App", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.IgnoredApp" + } + } + } + } + }, + "/apps/install": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "安装应用", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Install app", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstallCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/model.AppInstall" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "app_installs", + "input_column": "name", + "input_value": "name", + "isList": false, + "output_column": "app_id", + "output_value": "appId" + }, + { + "db": "apps", + "info": "appId", + "isList": false, + "output_column": "key", + "output_value": "appKey" + } + ], + "bodyKeys": [ + "name" + ], + "formatEN": "Install app [appKey]-[name]", + "formatZH": "安装应用 [appKey]-[name]", + "paramKeys": [] + } + } + }, + "/apps/installed/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检查应用安装情况", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Check app installed", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppInstalledCheck" + } + } + } + } + }, + "/apps/installed/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 key 获取应用默认配置", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search default config by key", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/apps/installed/conninfo/:key": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用连接信息", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app password by key", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/apps/installed/delete/check/:appInstallId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Check before delete", + "parameters": [ + { + "type": "integer", + "description": "App install id", + "name": "appInstallId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AppResource" + } + } + } + } + } + }, + "/apps/installed/ignore": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "忽略应用升级版本", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "ignore App Update", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledIgnoreUpgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "installId" + ], + "formatEN": "Application param update [installId]", + "formatZH": "忽略应用 [installId] 版本升级", + "paramKeys": [] + } + } + }, + "/apps/installed/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取已安装应用列表", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "List app installed", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AppInstallInfo" + } + } + } + } + } + }, + "/apps/installed/loadport": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用端口", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app port by key", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "integer" + } + } + } + } + }, + "/apps/installed/op": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作已安装应用", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Operate installed app", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "app_installs", + "input_column": "id", + "input_value": "installId", + "isList": false, + "output_column": "app_id", + "output_value": "appId" + }, + { + "db": "app_installs", + "input_column": "id", + "input_value": "installId", + "isList": false, + "output_column": "name", + "output_value": "appName" + }, + { + "db": "apps", + "input_column": "id", + "input_value": "appId", + "isList": false, + "output_column": "key", + "output_value": "appKey" + } + ], + "bodyKeys": [ + "installId", + "operate" + ], + "formatEN": "[operate] App [appKey][appName]", + "formatZH": "[operate] 应用 [appKey][appName]", + "paramKeys": [] + } + } + }, + "/apps/installed/params/:appInstallId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 install id 获取应用参数", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search params by appInstallId", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "appInstallId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppParam" + } + } + } + } + }, + "/apps/installed/params/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改应用参数", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Change app params", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "installId" + ], + "formatEN": "Application param update [installId]", + "formatZH": "应用参数修改 [installId]", + "paramKeys": [] + } + } + }, + "/apps/installed/port/change": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改应用端口", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Change app port", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PortUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "name", + "port" + ], + "formatEN": "Application port update [key]-[name] =\u003e [port]", + "formatZH": "应用端口修改 [key]-[name] =\u003e [port]", + "paramKeys": [] + } + } + }, + "/apps/installed/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分页获取已安装应用列表", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Page app installed", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/apps/installed/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步已安装应用列表", + "tags": [ + "App" + ], + "summary": "Sync app installed", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Sync the list of installed apps", + "formatZH": "同步已安装应用列表", + "paramKeys": [] + } + } + }, + "/apps/installed/update/versions": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 install id 获取应用更新版本", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app update version by install id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "appInstallId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AppVersion" + } + } + } + } + } + }, + "/apps/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用列表", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "List apps", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/apps/services/:key": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 key 获取应用 service", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app service by key", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "key", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.AppService" + } + } + } + } + } + }, + "/apps/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步应用列表", + "tags": [ + "App" + ], + "summary": "Sync app list", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "App store synchronization", + "formatZH": "应用商店同步", + "paramKeys": [] + } + } + }, + "/auth/captcha": { + "get": { + "description": "加载验证码", + "tags": [ + "Auth" + ], + "summary": "Load captcha", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CaptchaResponse" + } + } + } + } + }, + "/auth/demo": { + "get": { + "description": "判断是否为demo环境", + "tags": [ + "Auth" + ], + "summary": "Check System isDemo", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/issafety": { + "get": { + "description": "获取系统安全登录状态", + "tags": [ + "Auth" + ], + "summary": "Load safety status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/language": { + "get": { + "description": "获取系统语言设置", + "tags": [ + "Auth" + ], + "summary": "Load System Language", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/login": { + "post": { + "description": "用户登录", + "consumes": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "User login", + "parameters": [ + { + "type": "string", + "description": "安全入口 base64 加密串", + "name": "EntranceCode", + "in": "header", + "required": true + }, + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Login" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.UserLoginInfo" + } + } + } + } + }, + "/auth/logout": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "用户登出", + "tags": [ + "Auth" + ], + "summary": "User logout", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/mfalogin": { + "post": { + "description": "用户 mfa 登录", + "consumes": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "User login with mfa", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MFALogin" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.UserLoginInfo" + }, + "headers": { + "EntranceCode": { + "type": "string", + "description": "安全入口" + } + } + } + } + } + }, + "/containers": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Create container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "image" + ], + "formatEN": "create container [name][image]", + "formatZH": "创建容器 [name][image]", + "paramKeys": [] + } + } + }, + "/containers/clean/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清理容器日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Clean container log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "clean container [name] logs", + "formatZH": "清理容器 [name] 日志", + "paramKeys": [] + } + } + }, + "/containers/commit": { + "post": { + "description": "容器提交生成新镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Commit Container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerCommit" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/compose": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器编排", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Create compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create compose [name]", + "formatZH": "创建 compose [name]", + "paramKeys": [] + } + } + }, + "/containers/compose/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器编排操作", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Operate compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeOperation" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "operation" + ], + "formatEN": "compose [operation] [name]", + "formatZH": "compose [operation] [name]", + "paramKeys": [] + } + } + }, + "/containers/compose/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取编排列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Page composes", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/compose/search/log": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "docker-compose 日志", + "tags": [ + "Container Compose" + ], + "summary": "Container Compose logs", + "parameters": [ + { + "type": "string", + "description": "compose 文件地址", + "name": "compose", + "in": "query" + }, + { + "type": "string", + "description": "时间筛选", + "name": "since", + "in": "query" + }, + { + "type": "string", + "description": "是否追踪", + "name": "follow", + "in": "query" + }, + { + "type": "string", + "description": "显示行号", + "name": "tail", + "in": "query" + } + ], + "responses": {} + } + }, + "/containers/compose/test": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "测试 compose 是否可用", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Test compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "check compose [name]", + "formatZH": "检测 compose [name] 格式", + "paramKeys": [] + } + } + }, + "/containers/compose/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器编排", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Update compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "update compose information [name]", + "formatZH": "更新 compose [name]", + "paramKeys": [] + } + } + }, + "/containers/daemonjson": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 配置信息", + "produces": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Load docker daemon.json", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DaemonJsonConf" + } + } + } + } + }, + "/containers/daemonjson/file": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 配置信息(表单)", + "produces": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Load docker daemon.json", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/containers/daemonjson/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 docker 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "Updated configuration [key]", + "formatZH": "更新配置 [key]", + "paramKeys": [] + } + } + }, + "/containers/daemonjson/update/byfile": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传替换 docker 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json by upload file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DaemonJsonUpdateByFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Updated configuration file", + "formatZH": "更新配置文件", + "paramKeys": [] + } + } + }, + "/containers/docker/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Docker 操作", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Operate docker", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DockerOperation" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] docker service", + "formatZH": "docker 服务 [operation]", + "paramKeys": [] + } + } + }, + "/containers/docker/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 服务状态", + "produces": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Load docker status", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/containers/download/log": { + "post": { + "description": "下载容器日志", + "responses": {} + } + }, + "/containers/image": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像名称列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "load images options", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Options" + } + } + } + } + } + }, + "/containers/image/all": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取所有镜像列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "List all images", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ImageInfo" + } + } + } + } + } + }, + "/containers/image/build": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "构建镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Build image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageBuild" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "build image [name]", + "formatZH": "构建镜像 [name]", + "paramKeys": [] + } + } + }, + "/containers/image/load": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "导入镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Load image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageLoad" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "load image from [path]", + "formatZH": "从 [path] 加载镜像", + "paramKeys": [] + } + } + }, + "/containers/image/pull": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "拉取镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Pull image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImagePull" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "repoID", + "isList": false, + "output_column": "name", + "output_value": "reponame" + } + ], + "bodyKeys": [ + "repoID", + "imageName" + ], + "formatEN": "image pull [reponame][imageName]", + "formatZH": "镜像拉取 [reponame][imageName]", + "paramKeys": [] + } + } + }, + "/containers/image/push": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "推送镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Push image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImagePush" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "repoID", + "isList": false, + "output_column": "name", + "output_value": "reponame" + } + ], + "bodyKeys": [ + "repoID", + "tagName", + "name" + ], + "formatEN": "push [tagName] to [reponame][name]", + "formatZH": "[tagName] 推送到 [reponame][name]", + "paramKeys": [] + } + } + }, + "/containers/image/remove": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Delete image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names" + ], + "formatEN": "remove image [names]", + "formatZH": "移除镜像 [names]", + "paramKeys": [] + } + } + }, + "/containers/image/save": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "导出镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Save image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageSave" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "tagName", + "path", + "name" + ], + "formatEN": "save [tagName] as [path]/[name]", + "formatZH": "保留 [tagName] 为 [path]/[name]", + "paramKeys": [] + } + } + }, + "/containers/image/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Page images", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/image/tag": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Tag 镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Tag image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageTag" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "repoID", + "isList": false, + "output_column": "name", + "output_value": "reponame" + } + ], + "bodyKeys": [ + "repoID", + "targetName" + ], + "formatEN": "tag image [reponame][targetName]", + "formatZH": "tag 镜像 [reponame][targetName]", + "paramKeys": [] + } + } + }, + "/containers/info": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器表单信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Load container info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ContainerOperate" + } + } + } + } + }, + "/containers/inspect": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器详情", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Container inspect", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.InspectReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/containers/ipv6option/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 docker ipv6 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json ipv6 option", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.LogOption" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Updated the ipv6 option", + "formatZH": "更新 ipv6 配置", + "paramKeys": [] + } + } + }, + "/containers/limit": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器限制", + "summary": "Load container limits", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ResourceLimit" + } + } + } + } + }, + "/containers/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器名称", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "List containers", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/list/stats": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器列表资源占用", + "summary": "Load container stats", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ContainerListStats" + } + } + } + } + } + }, + "/containers/load/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器操作日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Load container log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/logoption/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 docker 日志配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json log option", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.LogOption" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Updated the log option", + "formatZH": "更新日志配置", + "paramKeys": [] + } + } + }, + "/containers/network": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器网络列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "List networks", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Options" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器网络", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "Create network", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.NetworkCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create container network [name]", + "formatZH": "创建容器网络 name", + "paramKeys": [] + } + } + }, + "/containers/network/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除容器网络", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "Delete network", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names" + ], + "formatEN": "delete container network [names]", + "formatZH": "删除容器网络 [names]", + "paramKeys": [] + } + } + }, + "/containers/network/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器网络列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "Page networks", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器操作", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Operate Container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerOperation" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names", + "operation" + ], + "formatEN": "container [operation] [names]", + "formatZH": "容器 [names] 执行 [operation]", + "paramKeys": [] + } + } + }, + "/containers/prune": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器清理", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Clean container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerPrune" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ContainerPruneReport" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "pruneType" + ], + "formatEN": "clean container [pruneType]", + "formatZH": "清理容器 [pruneType]", + "paramKeys": [] + } + } + }, + "/containers/rename": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器重命名", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Rename Container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerRename" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "newName" + ], + "formatEN": "rename container [name] =\u003e [newName]", + "formatZH": "容器重命名 [name] =\u003e [newName]", + "paramKeys": [] + } + } + }, + "/containers/repo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像仓库列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "List image repos", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ImageRepoOption" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建镜像仓库", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Create image repo", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageRepoDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create image repo [name]", + "formatZH": "创建镜像仓库 [name]", + "paramKeys": [] + } + } + }, + "/containers/repo/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除镜像仓库", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Delete image repo", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageRepoDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete image repo [names]", + "formatZH": "删除镜像仓库 [names]", + "paramKeys": [] + } + } + }, + "/containers/repo/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像仓库列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Page image repos", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/repo/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 仓库状态", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Load repo status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/repo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新镜像仓库", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Update image repo", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageRepoUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "update image repo information [name]", + "formatZH": "更新镜像仓库 [name]", + "paramKeys": [] + } + } + }, + "/containers/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Page containers", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageContainer" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/search/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器日志", + "tags": [ + "Container" + ], + "summary": "Container logs", + "parameters": [ + { + "type": "string", + "description": "容器名称", + "name": "container", + "in": "query" + }, + { + "type": "string", + "description": "时间筛选", + "name": "since", + "in": "query" + }, + { + "type": "string", + "description": "是否追踪", + "name": "follow", + "in": "query" + }, + { + "type": "string", + "description": "显示行号", + "name": "tail", + "in": "query" + } + ], + "responses": {} + } + }, + "/containers/stats/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器监控信息", + "tags": [ + "Container" + ], + "summary": "Container stats", + "parameters": [ + { + "type": "integer", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ContainerStats" + } + } + } + } + }, + "/containers/template": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器编排模版列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "List compose templates", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ComposeTemplateInfo" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器编排模版", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Create compose template", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeTemplateCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create compose template [name]", + "formatZH": "创建 compose 模版 [name]", + "paramKeys": [] + } + } + }, + "/containers/template/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除容器编排模版", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Delete compose template", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "compose_templates", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete compose template [names]", + "formatZH": "删除 compose 模版 [names]", + "paramKeys": [] + } + } + }, + "/containers/template/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器编排模版列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Page compose templates", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/template/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器编排模版", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Update compose template", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeTemplateUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "compose_templates", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "update compose template information [name]", + "formatZH": "更新 compose 模版 [name]", + "paramKeys": [] + } + } + }, + "/containers/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Update container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "image" + ], + "formatEN": "update container [name][image]", + "formatZH": "更新容器 [name][image]", + "paramKeys": [] + } + } + }, + "/containers/upgrade": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Upgrade container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerUpgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "image" + ], + "formatEN": "upgrade container image [name][image]", + "formatZH": "更新容器镜像 [name][image]", + "paramKeys": [] + } + } + }, + "/containers/volume": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器存储卷列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "List volumes", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Options" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器存储卷", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "Create volume", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.VolumeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create container volume [name]", + "formatZH": "创建容器存储卷 [name]", + "paramKeys": [] + } + } + }, + "/containers/volume/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除容器存储卷", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "Delete volume", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names" + ], + "formatEN": "delete container volume [names]", + "formatZH": "删除容器存储卷 [names]", + "paramKeys": [] + } + } + }, + "/containers/volume/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器存储卷分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "Page volumes", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/cronjobs": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Create cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name" + ], + "formatEN": "create cronjob [type][name]", + "formatZH": "创建计划任务 [type][name]", + "paramKeys": [] + } + } + }, + "/cronjobs/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Delete cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobBatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete cronjob [names]", + "formatZH": "删除计划任务 [names]", + "paramKeys": [] + } + } + }, + "/cronjobs/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载计划任务记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Download cronjob records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobDownload" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "job_records", + "input_column": "id", + "input_value": "recordID", + "isList": false, + "output_column": "file", + "output_value": "file" + } + ], + "bodyKeys": [ + "recordID" + ], + "formatEN": "download the cronjob record [file]", + "formatZH": "下载计划任务记录 [file]", + "paramKeys": [] + } + } + }, + "/cronjobs/handle": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "手动执行计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Handle cronjob once", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "manually execute the cronjob [name]", + "formatZH": "手动执行计划任务 [name]", + "paramKeys": [] + } + } + }, + "/cronjobs/records/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空计划任务记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Clean job records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobClean" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "clean cronjob [name] records", + "formatZH": "清空计划任务记录 [name]", + "paramKeys": [] + } + } + }, + "/cronjobs/records/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取计划任务记录日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Load Cronjob record log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/cronjobs/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取计划任务分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Page cronjobs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageCronjob" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/cronjobs/search/records": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取计划任务记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Page job records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchRecord" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/cronjobs/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新计划任务状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Update cronjob status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobUpdateStatus" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "status" + ], + "formatEN": "change the status of cronjob [name] to [status].", + "formatZH": "修改计划任务 [name] 状态为 [status]", + "paramKeys": [] + } + } + }, + "/cronjobs/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Update cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "update cronjob [name]", + "formatZH": "更新计划任务 [name]", + "paramKeys": [] + } + } + }, + "/dashboard/base/:ioOption/:netOption": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取首页基础数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "Load dashboard base info", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "ioOption", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "request", + "name": "netOption", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DashboardBase" + } + } + } + } + }, + "/dashboard/base/os": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取服务器基础数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "Load os info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.OsInfo" + } + } + } + } + }, + "/dashboard/current/:ioOption/:netOption": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取首页实时数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "Load dashboard current info", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "ioOption", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "request", + "name": "netOption", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DashboardCurrent" + } + } + } + } + }, + "/dashboard/system/restart/:operation": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "重启服务器/面板", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "System restart", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "operation", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/databases": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建 mysql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Create mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create mysql database [name]", + "formatZH": "创建 mysql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/bind": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "绑定 mysql 数据库用户", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Bind user of mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BindUser" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "database", + "username" + ], + "formatEN": "bind mysql database [database] [username]", + "formatZH": "绑定 mysql 数据库名 [database] [username]", + "paramKeys": [] + } + } + }, + "/databases/change/access": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 mysql 访问权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Change mysql access", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update database [name] access", + "formatZH": "更新数据库 [name] 访问权限", + "paramKeys": [] + } + } + }, + "/databases/change/password": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 mysql 密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Change mysql password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update database [name] password", + "formatZH": "更新数据库 [name] 密码", + "paramKeys": [] + } + } + }, + "/databases/common/info": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取数据库基础信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Common" + ], + "summary": "Load base info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DBBaseInfo" + } + } + } + } + }, + "/databases/common/load/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取数据库配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Common" + ], + "summary": "Load Database conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/databases/common/update/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传替换配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Common" + ], + "summary": "Update conf by upload file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DBConfUpdateByFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "database" + ], + "formatEN": "update the [type] [database] database configuration information", + "formatZH": "更新 [type] 数据库 [database] 配置信息", + "paramKeys": [] + } + } + }, + "/databases/db": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建远程数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Create database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "create database [name][type]", + "formatZH": "创建远程数据库 [name][type]", + "paramKeys": [] + } + } + }, + "/databases/db/:name": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取远程数据库", + "tags": [ + "Database" + ], + "summary": "Get databases", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DatabaseInfo" + } + } + } + } + }, + "/databases/db/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检测远程数据库连接性", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Check database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "check if database [name][type] is connectable", + "formatZH": "检测远程数据库 [name][type] 连接性", + "paramKeys": [] + } + } + }, + "/databases/db/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除远程数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Delete database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "databases", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete database [names]", + "formatZH": "删除远程数据库 [names]", + "paramKeys": [] + } + } + }, + "/databases/db/item/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取数据库列表", + "tags": [ + "Database" + ], + "summary": "List databases", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.DatabaseItem" + } + } + } + } + } + }, + "/databases/db/list/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取远程数据库列表", + "tags": [ + "Database" + ], + "summary": "List databases", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.DatabaseOption" + } + } + } + } + } + }, + "/databases/db/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取远程数据库列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Page databases", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/databases/db/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新远程数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Update database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "update database [name]", + "formatZH": "更新远程数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 mysql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Delete mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete mysql database [name]", + "formatZH": "删除 mysql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/del/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mysql 数据库删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Check before delete mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBDeleteCheck" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/databases/description/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 mysql 数据库库描述信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Update mysql database description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "description" + ], + "formatEN": "The description of the mysql database [name] is modified =\u003e [description]", + "formatZH": "mysql 数据库 [name] 描述信息修改 [description]", + "paramKeys": [] + } + } + }, + "/databases/load": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从服务器获取", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql database from remote", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlLoadDB" + } + } + ], + "responses": {} + } + }, + "/databases/options": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 数据库列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "List mysql database names", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MysqlOption" + } + } + } + } + } + }, + "/databases/pg": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建 postgresql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Create postgresql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create postgresql database [name]", + "formatZH": "创建 postgresql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/pg/:database/load": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从服务器获取", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Load postgresql database from remote", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlLoadDB" + } + } + ], + "responses": {} + } + }, + "/databases/pg/bind": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "绑定 postgresql 数据库用户", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Bind postgresql user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlBindUser" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "username" + ], + "formatEN": "bind postgresql database [name] user [username]", + "formatZH": "绑定 postgresql 数据库 [name] 用户 [username]", + "paramKeys": [] + } + } + }, + "/databases/pg/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 postgresql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Delete postgresql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_postgresqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete postgresql database [name]", + "formatZH": "删除 postgresql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/pg/del/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Postgresql 数据库删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Check before delete postgresql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBDeleteCheck" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/databases/pg/description": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 postgresql 数据库库描述信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Update postgresql database description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_postgresqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "description" + ], + "formatEN": "The description of the postgresql database [name] is modified =\u003e [description]", + "formatZH": "postgresql 数据库 [name] 描述信息修改 [description]", + "paramKeys": [] + } + } + }, + "/databases/pg/password": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 postgresql 密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Change postgresql password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_postgresqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update database [name] password", + "formatZH": "更新数据库 [name] 密码", + "paramKeys": [] + } + } + }, + "/databases/pg/privileges": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 postgresql 用户权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Change postgresql privileges", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "database", + "username" + ], + "formatEN": "Update [user] privileges of database [database]", + "formatZH": "更新数据库 [database] 用户 [username] 权限", + "paramKeys": [] + } + } + }, + "/databases/pg/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 postgresql 数据库列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Page postgresql databases", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/databases/redis/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Load redis conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.RedisConf" + } + } + } + } + }, + "/databases/redis/conf/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 redis 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Update redis conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RedisConfUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "update the redis database configuration information", + "formatZH": "更新 redis 数据库配置信息", + "paramKeys": [] + } + } + }, + "/databases/redis/install/cli": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "安装 redis cli", + "tags": [ + "Database Redis" + ], + "summary": "Install redis-cli", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/databases/redis/password": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 redis 密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Change redis password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeRedisPass" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "change the password of the redis database", + "formatZH": "修改 redis 数据库密码", + "paramKeys": [] + } + } + }, + "/databases/redis/persistence/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 持久化配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Load redis persistence conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.RedisPersistence" + } + } + } + } + }, + "/databases/redis/persistence/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 redis 持久化配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Update redis persistence conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RedisConfPersistenceUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "redis database persistence configuration update", + "formatZH": "redis 数据库持久化配置更新", + "paramKeys": [] + } + } + }, + "/databases/redis/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 状态信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Load redis status info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.RedisStatus" + } + } + } + } + }, + "/databases/remote": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 远程访问权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql remote access", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "boolean" + } + } + } + } + }, + "/databases/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 数据库列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Page mysql databases", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/databases/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 状态信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql status info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.MysqlStatus" + } + } + } + } + }, + "/databases/variables": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 性能参数信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql variables info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.MysqlVariables" + } + } + } + } + }, + "/databases/variables/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "mysql 性能调优", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Update mysql variables", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlVariablesUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "adjust mysql database performance parameters", + "formatZH": "调整 mysql 数据库性能参数", + "paramKeys": [] + } + } + }, + "/db/remote/del/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mysql 远程数据库删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Check before delete remote database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/files": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建文件/文件夹", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Create file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Create dir or file [path]", + "formatZH": "创建文件/文件夹 [path]", + "paramKeys": [] + } + } + }, + "/files/batch/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "批量删除文件/文件夹", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Batch delete file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileBatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "paths" + ], + "formatEN": "Batch delete dir or file [paths]", + "formatZH": "批量删除文件/文件夹 [paths]", + "paramKeys": [] + } + } + }, + "/files/batch/role": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "批量修改文件权限和用户/组", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Batch change file mode and owner", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileRoleReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "paths", + "mode", + "user", + "group" + ], + "formatEN": "Batch change file mode and owner [paths] =\u003e [mode]/[user]/[group]", + "formatZH": "批量修改文件权限和用户/组 [paths] =\u003e [mode]/[user]/[group]", + "paramKeys": [] + } + } + }, + "/files/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检测文件是否存在", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Check file exist", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FilePathCheck" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/chunkdownload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分片下载下载文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Chunk Download file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileDownload" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Download file [name]", + "formatZH": "下载文件 [name]", + "paramKeys": [] + } + } + }, + "/files/chunkupload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分片上传文件", + "tags": [ + "File" + ], + "summary": "ChunkUpload file", + "parameters": [ + { + "type": "file", + "description": "request", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/compress": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "压缩文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Compress file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileCompress" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Compress file [name]", + "formatZH": "压缩文件 [name]", + "paramKeys": [] + } + } + }, + "/files/content": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取文件内容", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Load file content", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileContentReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Load file content [path]", + "formatZH": "获取文件内容 [path]", + "paramKeys": [] + } + } + }, + "/files/decompress": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "解压文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Decompress file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileDeCompress" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Decompress file [path]", + "formatZH": "解压 [path]", + "paramKeys": [] + } + } + }, + "/files/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除文件/文件夹", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Delete file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Delete dir or file [path]", + "formatZH": "删除文件/文件夹 [path]", + "paramKeys": [] + } + } + }, + "/files/download": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Download file", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/favorite": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建收藏", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Create favorite", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FavoriteCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "收藏文件/文件夹 [path]", + "formatZH": "收藏文件/文件夹 [path]", + "paramKeys": [] + } + } + }, + "/files/favorite/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除收藏", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Delete favorite", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FavoriteDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "favorites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "path", + "output_value": "path" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete avorite [path]", + "formatZH": "删除收藏 [path]", + "paramKeys": [] + } + } + }, + "/files/favorite/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取收藏列表", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "List favorites", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/mode": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改文件权限", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Change file mode", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path", + "mode" + ], + "formatEN": "Change mode [paths] =\u003e [mode]", + "formatZH": "修改权限 [paths] =\u003e [mode]", + "paramKeys": [] + } + } + }, + "/files/move": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "移动文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Move file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileMove" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "oldPaths", + "newPath" + ], + "formatEN": "Move [oldPaths] =\u003e [newPath]", + "formatZH": "移动文件 [oldPaths] =\u003e [newPath]", + "paramKeys": [] + } + } + }, + "/files/owner": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改文件用户/组", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Change file owner", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileRoleUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path", + "user", + "group" + ], + "formatEN": "Change owner [paths] =\u003e [user]/[group]", + "formatZH": "修改用户/组 [paths] =\u003e [user]/[group]", + "paramKeys": [] + } + } + }, + "/files/read": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "按行读取日志文件", + "tags": [ + "File" + ], + "summary": "Read file by Line", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileReadByLineReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/recycle/clear": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空回收站文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Clear RecycleBin files", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "清空回收站", + "formatZH": "清空回收站", + "paramKeys": [] + } + } + }, + "/files/recycle/reduce": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "还原回收站文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Reduce RecycleBin files", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RecycleBinReduce" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Reduce RecycleBin file [name]", + "formatZH": "还原回收站文件 [name]", + "paramKeys": [] + } + } + }, + "/files/recycle/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取回收站文件列表", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "List RecycleBin files", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/recycle/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取回收站状态", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Get RecycleBin status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/rename": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改文件名称", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Change file name", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileRename" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "oldName", + "newName" + ], + "formatEN": "Rename [oldName] =\u003e [newName]", + "formatZH": "重命名 [oldName] =\u003e [newName]", + "paramKeys": [] + } + } + }, + "/files/save": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新文件内容", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Update file content", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileEdit" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Update file content [path]", + "formatZH": "更新文件内容 [path]", + "paramKeys": [] + } + } + }, + "/files/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取文件列表", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "List files", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileOption" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/files/size": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取文件夹大小", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Load file size", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.DirSizeReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Load file size [path]", + "formatZH": "获取文件夹大小 [path]", + "paramKeys": [] + } + } + }, + "/files/tree": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载文件树", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Load files tree", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileOption" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.FileTree" + } + } + } + } + } + }, + "/files/upload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传文件", + "tags": [ + "File" + ], + "summary": "Upload file", + "parameters": [ + { + "type": "file", + "description": "request", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Upload file [path]", + "formatZH": "上传文件 [path]", + "paramKeys": [] + } + } + }, + "/files/upload/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分页获取上传文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Page file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.SearchUploadWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + } + }, + "/files/wget": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载远端文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Wget file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileWget" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "url", + "path", + "name" + ], + "formatEN": "Download url =\u003e [path]/[name]", + "formatZH": "下载 url =\u003e [path]/[name]", + "paramKeys": [] + } + } + }, + "/groups": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GroupCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "create group [name][type]", + "formatZH": "创建组 [name][type]", + "paramKeys": [] + } + } + }, + "/groups/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "Delete group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "groups", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + }, + { + "db": "groups", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "type", + "output_value": "type" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete group [type][name]", + "formatZH": "删除组 [type][name]", + "paramKeys": [] + } + } + }, + "/groups/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "查询系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "List groups", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GroupSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.GroupInfo" + } + } + } + } + } + }, + "/groups/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "Update group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GroupUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "update group [name][type]", + "formatZH": "更新组 [name][type]", + "paramKeys": [] + } + } + }, + "/host/conffile/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传文件更新 SSH 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Update host SSH setting by file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SSHConf" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "update SSH conf", + "formatZH": "修改 SSH 配置文件", + "paramKeys": [] + } + } + }, + "/host/ssh/conf": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 SSH 配置文件", + "tags": [ + "SSH" + ], + "summary": "Load host SSH conf", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/ssh/generate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "生成 SSH 密钥", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Generate host SSH secret", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GenerateSSH" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "generate SSH secret", + "formatZH": "生成 SSH 密钥 ", + "paramKeys": [] + } + } + }, + "/host/ssh/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 SSH 登录日志", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Load host SSH logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchSSHLog" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SSHLog" + } + } + } + } + }, + "/host/ssh/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 SSH 服务状态", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Operate SSH", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] SSH", + "formatZH": "[operation] SSH ", + "paramKeys": [] + } + } + }, + "/host/ssh/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载 SSH 配置信息", + "tags": [ + "SSH" + ], + "summary": "Load host SSH setting info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SSHInfo" + } + } + } + } + }, + "/host/ssh/secret": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 SSH 密钥", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Load host SSH secret", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GenerateLoad" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/ssh/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 SSH 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Update host SSH setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SSHUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update SSH setting [key] =\u003e [value]", + "formatZH": "修改 SSH 配置 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/host/tool": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取主机工具状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get tool", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/tool/config": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作主机工具配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get tool config", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolConfig" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate" + ], + "formatEN": "[operate] tool config", + "formatZH": "[operate] 主机工具配置文件 ", + "paramKeys": [] + } + } + }, + "/host/tool/create": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建主机工具配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Create Host tool Config", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "create [type] config", + "formatZH": "创建 [type] 配置", + "paramKeys": [] + } + } + }, + "/host/tool/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取主机工具日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get tool", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolLogReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/tool/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作主机工具", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Operate tool", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate", + "type" + ], + "formatEN": "[operate] [type]", + "formatZH": "[operate] [type] ", + "paramKeys": [] + } + } + }, + "/host/tool/supervisor/process": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Supervisor 进程配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get Supervisor process config", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作守护进程", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Create Supervisor process", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.SupervisorProcessConfig" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate" + ], + "formatEN": "[operate] process", + "formatZH": "[operate] 守护进程 ", + "paramKeys": [] + } + } + }, + "/host/tool/supervisor/process/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作 Supervisor 进程文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get Supervisor process config", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.SupervisorProcessFileReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate" + ], + "formatEN": "[operate] Supervisor Process Config file", + "formatZH": "[operate] Supervisor 进程文件 ", + "paramKeys": [] + } + } + }, + "/hosts": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建主机", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Create host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.HostOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "addr" + ], + "formatEN": "create host [name][addr]", + "formatZH": "创建主机 [name][addr]", + "paramKeys": [] + } + } + }, + "/hosts/command": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快速命令列表", + "tags": [ + "Command" + ], + "summary": "List commands", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CommandInfo" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Create command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommandOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "command" + ], + "formatEN": "create quick command [name][command]", + "formatZH": "创建快捷命令 [name][command]", + "paramKeys": [] + } + } + }, + "/hosts/command/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Delete command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "commands", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete quick command [names]", + "formatZH": "删除快捷命令 [names]", + "paramKeys": [] + } + } + }, + "/hosts/command/redis": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 快速命令列表", + "tags": [ + "Redis Command" + ], + "summary": "List redis commands", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "保存 Redis 快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Redis Command" + ], + "summary": "Save redis command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RedisCommand" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "command" + ], + "formatEN": "save quick command for redis [name][command]", + "formatZH": "保存 redis 快捷命令 [name][command]", + "paramKeys": [] + } + } + }, + "/hosts/command/redis/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 redis 快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Redis Command" + ], + "summary": "Delete redis command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "redis_commands", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete quick command of redis [names]", + "formatZH": "删除 redis 快捷命令 [names]", + "paramKeys": [] + } + } + }, + "/hosts/command/redis/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 快速命令列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Redis Command" + ], + "summary": "Page redis commands", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/hosts/command/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快速命令列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Page commands", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/hosts/command/tree": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快速命令树", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Tree commands", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + } + }, + "/hosts/command/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Update command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommandOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "update quick command [name]", + "formatZH": "更新快捷命令 [name]", + "paramKeys": [] + } + } + }, + "/hosts/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除主机", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Delete host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "hosts", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "addr", + "output_value": "addrs" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete host [addrs]", + "formatZH": "删除主机 [addrs]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取防火墙基础信息", + "tags": [ + "Firewall" + ], + "summary": "Load firewall base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.FirewallBaseInfo" + } + } + } + } + }, + "/hosts/firewall/batch": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "批量删除防火墙规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/firewall/forward": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新防火墙端口转发规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ForwardRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "source_port" + ], + "formatEN": "update port forward rules [source_port]", + "formatZH": "更新端口转发规则 [source_port]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/ip": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建防火墙 IP 规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.AddrRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "strategy", + "address" + ], + "formatEN": "create address rules [strategy][address]", + "formatZH": "添加 ip 规则 [strategy] [address]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改防火墙状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Page firewall status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FirewallOperation" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] firewall", + "formatZH": "[operation] 防火墙", + "paramKeys": [] + } + } + }, + "/hosts/firewall/port": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建防火墙端口规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PortRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "port", + "strategy" + ], + "formatEN": "create port rules [strategy][port]", + "formatZH": "添加端口规则 [strategy] [port]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取防火墙规则列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Page firewall rules", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RuleSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/hosts/firewall/update/addr": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 ip 防火墙规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.AddrRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/firewall/update/description": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新防火墙描述", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Update rule description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateFirewallDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/firewall/update/port": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新端口防火墙规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PortRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/monitor/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空监控数据", + "tags": [ + "Monitor" + ], + "summary": "Clean monitor datas", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "clean monitor datas", + "formatZH": "清空监控数据", + "paramKeys": [] + } + } + }, + "/hosts/monitor/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取监控数据", + "tags": [ + "Monitor" + ], + "summary": "Load monitor datas", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MonitorSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取主机列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Page host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchHostWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.HostTree" + } + } + } + } + } + }, + "/hosts/test/byid/:id": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "测试主机连接", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Test host conn by host id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "boolean" + } + } + } + } + }, + "/hosts/test/byinfo": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "测试主机连接", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Test host conn by info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.HostConnTest" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/tree": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载主机树", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Load host tree", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchForTree" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.HostTree" + } + } + } + } + } + }, + "/hosts/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新主机", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Update host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.HostOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "addr" + ], + "formatEN": "update host [name][addr]", + "formatZH": "更新主机信息 [name][addr]", + "paramKeys": [] + } + } + }, + "/hosts/update/group": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "切换分组", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Update host group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeHostGroup" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "hosts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "addr", + "output_value": "addr" + } + ], + "bodyKeys": [ + "id", + "group" + ], + "formatEN": "change host [addr] group =\u003e [group]", + "formatZH": "切换主机[addr]分组 =\u003e [group]", + "paramKeys": [] + } + } + }, + "/logs/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空操作日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Logs" + ], + "summary": "Clean operation logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CleanLog" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "logType" + ], + "formatEN": "Clean the [logType] log information", + "formatZH": "清空 [logType] 日志信息", + "paramKeys": [] + } + } + }, + "/logs/login": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统登录日志列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Logs" + ], + "summary": "Page login logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchLgLogWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/logs/operation": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统操作日志列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Logs" + ], + "summary": "Page operation logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchOpLogWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/logs/system": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统日志", + "tags": [ + "Logs" + ], + "summary": "Load system logs", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/logs/system/files": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统日志文件列表", + "tags": [ + "Logs" + ], + "summary": "Load system log files", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/openresty": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 OpenResty 配置信息", + "tags": [ + "OpenResty" + ], + "summary": "Load OpenResty conf", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/openresty/clear": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清理 OpenResty 代理缓存", + "tags": [ + "OpenResty" + ], + "summary": "Clear OpenResty proxy cache", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Clear nginx proxy cache", + "formatZH": "清理 Openresty 代理缓存", + "paramKeys": [] + } + } + }, + "/openresty/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传更新 OpenResty 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "OpenResty" + ], + "summary": "Update OpenResty conf by upload file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxConfigFileUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Update nginx conf", + "formatZH": "更新 nginx 配置", + "paramKeys": [] + } + } + }, + "/openresty/scope": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取部分 OpenResty 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "OpenResty" + ], + "summary": "Load partial OpenResty conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxScopeReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.NginxParam" + } + } + } + } + } + }, + "/openresty/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 OpenResty 状态信息", + "tags": [ + "OpenResty" + ], + "summary": "Load OpenResty status info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.NginxStatus" + } + } + } + } + }, + "/openresty/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 OpenResty 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "OpenResty" + ], + "summary": "Update OpenResty conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxConfigUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Update nginx conf [domain]", + "formatZH": "更新 nginx 配置 [domain]", + "paramKeys": [] + } + } + }, + "/process/stop": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "停止进程", + "tags": [ + "Process" + ], + "summary": "Stop Process", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ProcessReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "PID" + ], + "formatEN": "结束进程 [PID]", + "formatZH": "结束进程 [PID]", + "paramKeys": [] + } + } + }, + "/runtimes": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Create runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Create runtime [name]", + "formatZH": "创建运行环境 [name]", + "paramKeys": [] + } + } + }, + "/runtimes/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Get runtime", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Delete runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website [name]", + "formatZH": "删除网站 [name]", + "paramKeys": [] + } + } + }, + "/runtimes/node/modules": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Node 项目的 modules", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Get Node modules", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NodeModuleReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/node/modules/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作 Node 项目 modules", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Operate Node modules", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NodeModuleReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/node/package": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Node 项目的 scripts", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Get Node package scripts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NodePackageReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Operate runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "id" + ], + "formatEN": "Operate runtime [name]", + "formatZH": "操作运行环境 [name]", + "paramKeys": [] + } + } + }, + "/runtimes/php/extensions": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Create Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Create Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/php/extensions/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Delete Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Delete Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/php/extensions/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Page Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Page Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.PHPExtensionsDTO" + } + } + } + } + } + }, + "/runtimes/php/extensions/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Update Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Update Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取运行环境列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "List runtimes", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步运行环境状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Sync runtime status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Update runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Update runtime [name]", + "formatZH": "更新运行环境 [name]", + "paramKeys": [] + } + } + }, + "/settings/backup": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建备份账号", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Create backup account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BackupOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "create backup account [type]", + "formatZH": "创建备份账号 [type]", + "paramKeys": [] + } + } + }, + "/settings/backup/backup": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "备份系统数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Backup system data", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommonBackup" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name", + "detailName" + ], + "formatEN": "backup [type] data [name][detailName]", + "formatZH": "备份 [type] 数据 [name][detailName]", + "paramKeys": [] + } + } + }, + "/settings/backup/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除备份账号", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Delete backup account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "backup_accounts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "type", + "output_value": "types" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete backup account [types]", + "formatZH": "删除备份账号 [types]", + "paramKeys": [] + } + } + }, + "/settings/backup/onedrive": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 OneDrive 信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Load OneDrive info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.OneDriveInfo" + } + } + } + } + }, + "/settings/backup/record/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除备份记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Delete backup record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "backup_records", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "file_name", + "output_value": "files" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete backup records [files]", + "formatZH": "删除备份记录 [files]", + "paramKeys": [] + } + } + }, + "/settings/backup/record/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载备份记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Download backup record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DownloadRecord" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "source", + "fileName" + ], + "formatEN": "download backup records [source][fileName]", + "formatZH": "下载备份记录 [source][fileName]", + "paramKeys": [] + } + } + }, + "/settings/backup/record/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取备份记录列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Page backup records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RecordSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/backup/record/search/bycronjob": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过计划任务获取备份记录列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Page backup records by cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RecordSearchByCronjob" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/backup/recover": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "恢复系统数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Recover system data", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommonRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name", + "detailName", + "file" + ], + "formatEN": "recover [type] data [name][detailName] from [file]", + "formatZH": "从 [file] 恢复 [type] 数据 [name][detailName]", + "paramKeys": [] + } + } + }, + "/settings/backup/recover/byupload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从上传恢复系统数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Recover system data by upload", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommonRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name", + "detailName", + "file" + ], + "formatEN": "recover [type] data [name][detailName] from [file]", + "formatZH": "从 [file] 恢复 [type] 数据 [name][detailName]", + "paramKeys": [] + } + } + }, + "/settings/backup/refresh/onedrive": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "刷新 OneDrive token", + "tags": [ + "Backup Account" + ], + "summary": "Refresh OneDrive token", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/backup/search": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取备份账号列表", + "tags": [ + "Backup Account" + ], + "summary": "List backup accounts", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.BackupInfo" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 bucket 列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "List buckets", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ForBuckets" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/settings/backup/search/files": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取备份账号内文件列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "List files from backup accounts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BackupSearchFile" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/settings/backup/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新备份账号信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Update backup account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BackupOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "update backup account [types]", + "formatZH": "更新备份账号 [types]", + "paramKeys": [] + } + } + }, + "/settings/basedir": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取安装根目录", + "tags": [ + "System Setting" + ], + "summary": "Load local backup dir", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/settings/bind/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统监听信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system bind info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BindInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "ipv6", + "bindAddress" + ], + "formatEN": "update system bind info =\u003e ipv6: [ipv6], 监听 IP: [bindAddress]", + "formatZH": "修改系统监听信息 =\u003e ipv6: [ipv6], 监听 IP: [bindAddress]", + "paramKeys": [] + } + } + }, + "/settings/expired/handle": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "重置过期系统登录密码", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Reset system password expired", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PasswordUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "reset an expired Password", + "formatZH": "重置过期密码", + "paramKeys": [] + } + } + }, + "/settings/interface": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统地址信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load system address", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/menu/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "隐藏高级功能菜单", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Hide advanced feature menu.", + "formatZH": "隐藏高级功能菜单", + "paramKeys": [] + } + } + }, + "/settings/mfa": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mfa 信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load mfa info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MfaCredential" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/mfa.Otp" + } + } + } + } + }, + "/settings/mfa/bind": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mfa 绑定", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Bind mfa", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MfaCredential" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "bind mfa", + "formatZH": "mfa 绑定", + "paramKeys": [] + } + } + }, + "/settings/password/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统登录密码", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PasswordUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "update system password", + "formatZH": "修改系统密码", + "paramKeys": [] + } + } + }, + "/settings/port/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统端口", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system port", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PortUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "serverPort" + ], + "formatEN": "update system port =\u003e [serverPort]", + "formatZH": "修改系统端口 =\u003e [serverPort]", + "paramKeys": [] + } + } + }, + "/settings/proxy/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "服务器代理配置", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update proxy setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ProxyUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "proxyUrl", + "proxyPort" + ], + "formatEN": "set proxy [proxyPort]:[proxyPort].", + "formatZH": "服务器代理配置 [proxyPort]:[proxyPort]", + "paramKeys": [] + } + } + }, + "/settings/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载系统配置信息", + "tags": [ + "System Setting" + ], + "summary": "Load system setting info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SettingInfo" + } + } + } + } + }, + "/settings/search/available": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统可用状态", + "tags": [ + "System Setting" + ], + "summary": "Load system available status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/snapshot": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建系统快照", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Create system snapshot", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "from", + "description" + ], + "formatEN": "Create system backup [description] to [from]", + "formatZH": "创建系统快照 [description] 到 [from]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除系统快照", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Delete system backup", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotBatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "Delete system backup [name]", + "formatZH": "删除系统快照 [name]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/description/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新快照描述信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update snapshot description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "description" + ], + "formatEN": "The description of the snapshot [name] is modified =\u003e [description]", + "formatZH": "快照 [name] 描述信息修改 [description]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/import": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "导入已有快照", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Import system snapshot", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotImport" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "from", + "names" + ], + "formatEN": "Sync system snapshots [names] from [from]", + "formatZH": "从 [from] 同步系统快照 [names]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/recover": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从系统快照恢复", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Recover system backup", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Recover from system backup [name]", + "formatZH": "从系统快照 [name] 恢复", + "paramKeys": [] + } + } + }, + "/settings/snapshot/rollback": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从系统快照回滚", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Rollback system backup", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Rollback from system backup [name]", + "formatZH": "从系统快照 [name] 回滚", + "paramKeys": [] + } + } + }, + "/settings/snapshot/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统快照列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Page system snapshot", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/settings/snapshot/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快照状态", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load Snapshot status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/ssl/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载证书", + "tags": [ + "System Setting" + ], + "summary": "Download system cert", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/ssl/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取证书信息", + "tags": [ + "System Setting" + ], + "summary": "Load system cert info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SettingInfo" + } + } + } + } + }, + "/settings/ssl/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统 ssl 登录", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SSLUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "ssl" + ], + "formatEN": "update system ssl =\u003e [ssl]", + "formatZH": "修改系统 ssl =\u003e [ssl]", + "paramKeys": [] + } + } + }, + "/settings/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统配置", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update system setting [key] =\u003e [value]", + "formatZH": "修改系统配置 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/settings/upgrade": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取版本 release notes", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load release notes by version", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Upgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "系统更新", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Upgrade", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Upgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "version" + ], + "formatEN": "upgrade system =\u003e [version]", + "formatZH": "更新系统 =\u003e [version]", + "paramKeys": [] + } + } + }, + "/toolbox/clam": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建扫描规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Create clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "path" + ], + "formatEN": "create clam [name][path]", + "formatZH": "创建扫描规则 [name][path]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Clam 基础信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Load clam base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ClamBaseInfo" + } + } + } + } + }, + "/toolbox/clam/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除扫描规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Delete clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete clam [names]", + "formatZH": "删除扫描规则 [names]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/file/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Load clam file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamFileReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/clam/file/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新病毒扫描配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Update clam file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateByNameAndFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/clam/handle": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "执行病毒扫描", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Handle clam scan", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "id", + "isList": true, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "handle clam scan [name]", + "formatZH": "执行病毒扫描 [name]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 Clam 状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Operate Clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] FTP", + "formatZH": "[operation] Clam", + "paramKeys": [] + } + } + }, + "/toolbox/clam/record/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空扫描报告", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Clean clam record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "id", + "isList": true, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "clean clam record [name]", + "formatZH": "清空扫描报告 [name]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/record/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描结果详情", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Load clam record detail", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamLogReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/clam/record/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描结果列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Page clam record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamLogSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/clam/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描规则列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Page clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/clam/status/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改扫描规则状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Update clam status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamUpdateStatus" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "status" + ], + "formatEN": "change the status of clam [name] to [status].", + "formatZH": "修改扫描规则 [name] 状态为 [status]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改扫描规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Update clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "path" + ], + "formatEN": "update clam [name][path]", + "formatZH": "修改扫描规则 [name][path]", + "paramKeys": [] + } + } + }, + "/toolbox/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清理系统垃圾文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Clean system", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Clean" + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Clean system junk files", + "formatZH": "清理系统垃圾文件", + "paramKeys": [] + } + } + }, + "/toolbox/device/base": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取设备基础信息", + "tags": [ + "Device" + ], + "summary": "Load device base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DeviceBaseInfo" + } + } + } + } + }, + "/toolbox/device/check/dns": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检查系统 DNS 配置可用性", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Check device DNS conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "load conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/update/byconf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过文件修改配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device conf by file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateByNameAndFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/update/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统参数", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update device conf [key] =\u003e [value]", + "formatZH": "修改主机参数 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/toolbox/device/update/host": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统 hosts", + "tags": [ + "Device" + ], + "summary": "Update device hosts", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update device host [key] =\u003e [value]", + "formatZH": "修改主机 Host [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/toolbox/device/update/passwd": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device passwd", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangePasswd" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/update/swap": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统 Swap", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device swap", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SwapHelper" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate", + "path" + ], + "formatEN": "[operate] device swap [path]", + "formatZH": "[operate] 主机 swap [path]", + "paramKeys": [] + } + } + }, + "/toolbox/device/zone/options": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统可用时区选项", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "list time zone options", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + } + }, + "/toolbox/fail2ban/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Fail2ban 基础信息", + "tags": [ + "Fail2ban" + ], + "summary": "Load fail2ban base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.Fail2BanBaseInfo" + } + } + } + } + }, + "/toolbox/fail2ban/load/conf": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 fail2ban 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Load fail2ban conf", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/fail2ban/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 Fail2ban 状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Operate fail2ban", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] Fail2ban", + "formatZH": "[operation] Fail2ban", + "paramKeys": [] + } + } + }, + "/toolbox/fail2ban/operate/sshd": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "配置 sshd", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Operate sshd of fail2ban", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {} + } + }, + "/toolbox/fail2ban/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Fail2ban ip", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Page fail2ban ip list", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Fail2BanSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + } + }, + "/toolbox/fail2ban/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 Fail2ban 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Update fail2ban conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Fail2BanUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update fail2ban conf [key] =\u003e [value]", + "formatZH": "修改 Fail2ban 配置 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/toolbox/fail2ban/update/byconf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过文件修改 fail2ban 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Update fail2ban conf by file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateByFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/ftp": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Create FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FtpCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "user", + "path" + ], + "formatEN": "create FTP [user][path]", + "formatZH": "创建 FTP 账户 [user][path]", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 FTP 基础信息", + "tags": [ + "FTP" + ], + "summary": "Load FTP base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.FtpBaseInfo" + } + } + } + } + }, + "/toolbox/ftp/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Delete FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "ftps", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "user", + "output_value": "users" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete FTP users [users]", + "formatZH": "删除 FTP 账户 [users]", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/log/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 FTP 操作日志", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Load FTP operation log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FtpLogSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/ftp/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 FTP 状态", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Operate FTP", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] FTP", + "formatZH": "[operation] FTP", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 FTP 账户列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Page FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/ftp/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Sync FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "sync FTP users", + "formatZH": "同步 FTP 账户", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Update FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FtpUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "user", + "path" + ], + "formatEN": "update FTP [user][path]", + "formatZH": "修改 FTP 账户 [user][path]", + "paramKeys": [] + } + } + }, + "/toolbox/scan": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "扫描系统垃圾文件", + "tags": [ + "Device" + ], + "summary": "Scan system", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "scan System Junk Files", + "formatZH": "扫描系统垃圾文件", + "paramKeys": [] + } + } + }, + "/websites": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Create website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "primaryDomain" + ], + "formatEN": "Create website [primaryDomain]", + "formatZH": "创建网站 [primaryDomain]", + "paramKeys": [] + } + } + }, + "/websites/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 查询网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Search website by id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteDTO" + } + } + } + } + }, + "/websites/:id/config/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 查询网站 nginx", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Search website nginx by id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/websites/:id/https": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 https 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website HTTPS" + ], + "summary": "Load https conf", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteHTTPS" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 https 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website HTTPS" + ], + "summary": "Update https conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteHTTPSOp" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteHTTPS" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Update website https [domain] conf", + "formatZH": "更新网站 [domain] https 配置", + "paramKeys": [] + } + } + }, + "/websites/acme": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 acme", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Acme" + ], + "summary": "Create website acme account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteAcmeAccountCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteAcmeAccountDTO" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "email" + ], + "formatEN": "Create website acme [email]", + "formatZH": "创建网站 acme [email]", + "paramKeys": [] + } + } + }, + "/websites/acme/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 acme", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Acme" + ], + "summary": "Delete website acme account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_acme_accounts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "email", + "output_value": "email" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website acme [email]", + "formatZH": "删除网站 acme [email]", + "paramKeys": [] + } + } + }, + "/websites/acme/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 acme 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Acme" + ], + "summary": "Page website acme accounts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/auths": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取密码访问配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get AuthBasic conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxAuthReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/auths/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新密码访问配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get AuthBasic conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxAuthUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/ca": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 ca", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Create website ca", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCACreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/request.WebsiteCACreate" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Create website ca [name]", + "formatZH": "创建网站 ca [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 ca", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Delete website ca", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCommonReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website ca [name]", + "formatZH": "删除网站 ca [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载 CA 证书文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Download CA file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "download ca file [name]", + "formatZH": "下载 CA 证书文件 [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/obtain": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "自签 SSL 证书", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Obtain SSL", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCAObtain" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Obtain SSL [name]", + "formatZH": "自签 SSL 证书 [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/renew": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "续签 SSL 证书", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Obtain SSL", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCAObtain" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Obtain SSL [name]", + "formatZH": "自签 SSL 证书 [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 ca 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Page website ca", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCASearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/ca/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 ca", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Get website ca", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteCADTO" + } + } + } + } + }, + "/websites/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "网站创建前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Check before create website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteInstallCheckReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.WebsitePreInstallCheck" + } + } + } + } + } + }, + "/websites/config": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 nginx 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Load nginx conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxScopeReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteNginxConfig" + } + } + } + } + }, + "/websites/config/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 nginx 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Update nginx conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxConfigUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Nginx conf update [domain]", + "formatZH": "nginx 配置修改 [domain]", + "paramKeys": [] + } + } + }, + "/websites/default/html/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取默认 html", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get default html", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/websites/default/html/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新默认 html", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update default html", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteHtmlUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "Update default html", + "formatZH": "更新默认 html", + "paramKeys": [] + } + } + }, + "/websites/default/server": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作网站日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Change default server", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDefaultUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id", + "operate" + ], + "formatEN": "Change default server =\u003e [domain]", + "formatZH": "修改默认 server =\u003e [domain]", + "paramKeys": [] + } + } + }, + "/websites/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Delete website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website [domain]", + "formatZH": "删除网站 [domain]", + "paramKeys": [] + } + } + }, + "/websites/dir": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站目录配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get website dir", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCommonReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/dir/permission": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站目录权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update Site Dir permission", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteUpdateDirPermission" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update domain [domain] dir permission", + "formatZH": "更新网站 [domain] 目录权限", + "paramKeys": [] + } + } + }, + "/websites/dir/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站目录", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update Site Dir", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteUpdateDir" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update domain [domain] dir", + "formatZH": "更新网站 [domain] 目录", + "paramKeys": [] + } + } + }, + "/websites/dns": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 dns", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Create website dns account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDnsAccountCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Create website dns [name]", + "formatZH": "创建网站 dns [name]", + "paramKeys": [] + } + } + }, + "/websites/dns/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 dns", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Delete website dns account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_dns_accounts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website dns [name]", + "formatZH": "删除网站 dns [name]", + "paramKeys": [] + } + } + }, + "/websites/dns/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 dns 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Page website dns accounts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/dns/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站 dns", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Update website dns account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDnsAccountUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Update website dns [name]", + "formatZH": "更新网站 dns [name]", + "paramKeys": [] + } + } + }, + "/websites/domains": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站域名", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Domain" + ], + "summary": "Create website domain", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDomainCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/model.WebsiteDomain" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "domain" + ], + "formatEN": "Create domain [domain]", + "formatZH": "创建域名 [domain]", + "paramKeys": [] + } + } + }, + "/websites/domains/:websiteId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过网站 id 查询域名", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Domain" + ], + "summary": "Search website domains by websiteId", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "websiteId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/model.WebsiteDomain" + } + } + } + } + } + }, + "/websites/domains/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站域名", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Domain" + ], + "summary": "Delete website domain", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDomainDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_domains", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete domain [domain]", + "formatZH": "删除域名 [domain]", + "paramKeys": [] + } + } + }, + "/websites/leech": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取防盗链配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get AntiLeech conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxCommonReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/leech/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新防盗链配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update AntiLeech", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxAntiLeechUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站列表", + "tags": [ + "Website" + ], + "summary": "List websites", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.WebsiteDTO" + } + } + } + } + } + }, + "/websites/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作网站日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Operate website log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteLogReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteLog" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id", + "operate" + ], + "formatEN": "[domain][operate] logs", + "formatZH": "[domain][operate] 日志", + "paramKeys": [] + } + } + }, + "/websites/nginx/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 网站 nginx 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Update website nginx conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteNginxUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "[domain] Nginx conf update", + "formatZH": "[domain] Nginx 配置修改", + "paramKeys": [] + } + } + }, + "/websites/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Operate website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteOp" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id", + "operate" + ], + "formatEN": "[operate] website [domain]", + "formatZH": "[operate] 网站 [domain]", + "paramKeys": [] + } + } + }, + "/websites/options": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站列表", + "tags": [ + "Website" + ], + "summary": "List website names", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/websites/php/config": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 网站 PHP 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website PHP" + ], + "summary": "Update website php conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsitePHPConfigUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "[domain] PHP conf update", + "formatZH": "[domain] PHP 配置修改", + "paramKeys": [] + } + } + }, + "/websites/php/config/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 php 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Load website php conf", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.PHPConfig" + } + } + } + } + }, + "/websites/php/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 php 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website PHP" + ], + "summary": "Update php conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsitePHPFileUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Nginx conf update [domain]", + "formatZH": "php 配置修改 [domain]", + "paramKeys": [] + } + } + }, + "/websites/php/version": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "变更 php 版本", + "consumes": [ + "application/json" + ], + "tags": [ + "Website PHP" + ], + "summary": "Update php version", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsitePHPVersionReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "php version update [domain]", + "formatZH": "php 版本变更 [domain]", + "paramKeys": [] + } + } + }, + "/websites/proxies": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取反向代理配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get proxy conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteProxyReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/proxies/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改反向代理配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update proxy conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteProxyConfig" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update domain [domain] proxy config", + "formatZH": "修改网站 [domain] 反向代理配置 ", + "paramKeys": [] + } + } + }, + "/websites/proxy/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新反向代理文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update proxy file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxProxyUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf proxy file update [domain]", + "formatZH": "更新反向代理文件 [domain]", + "paramKeys": [] + } + } + }, + "/websites/redirect": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取重定向配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get redirect conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteProxyReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/redirect/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新重定向文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update redirect file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRedirectUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf redirect file update [domain]", + "formatZH": "更新重定向文件 [domain]", + "paramKeys": [] + } + } + }, + "/websites/redirect/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改重定向配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update redirect conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRedirectReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Update domain [domain] redirect config", + "formatZH": "修改网站 [domain] 重定向理配置 ", + "paramKeys": [] + } + } + }, + "/websites/rewrite": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/rewrite/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf rewrite update [domain]", + "formatZH": "伪静态配置修改 [domain]", + "paramKeys": [] + } + } + }, + "/websites/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Page websites", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/ssl": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Create website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/request.WebsiteSSLCreate" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "primaryDomain" + ], + "formatEN": "Create website ssl [primaryDomain]", + "formatZH": "创建网站 ssl [primaryDomain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 查询 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Search website ssl by id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/ssl/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Delete website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteBatchDelReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "Delete ssl [domain]", + "formatZH": "删除 ssl [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载证书文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Download SSL file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "download ssl file [domain]", + "formatZH": "下载证书文件 [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/obtain": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "申请证书", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Apply ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLApply" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "ID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "ID" + ], + "formatEN": "apply ssl [domain]", + "formatZH": "申请证书 [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/resolve": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "解析网站 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Resolve website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDNSReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.WebsiteDNSRes" + } + } + } + } + } + }, + "/websites/ssl/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 ssl 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Page website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/ssl/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Update ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update ssl config [domain]", + "formatZH": "更新证书设置 [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/upload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Upload ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLUpload" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "Upload ssl [type]", + "formatZH": "上传 ssl [type]", + "paramKeys": [] + } + } + }, + "/websites/ssl/website/:websiteId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过网站 id 查询 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Search website ssl by website id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "websiteId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "primaryDomain" + ], + "formatEN": "Update website [primaryDomain]", + "formatZH": "更新网站 [primaryDomain]", + "paramKeys": [] + } + } + } + }, + "definitions": { + "dto.AddrRuleOperate": { + "type": "object", + "required": [ + "address", + "operation", + "strategy" + ], + "properties": { + "address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "strategy": { + "type": "string", + "enum": [ + "accept", + "drop" + ] + } + } + }, + "dto.AddrRuleUpdate": { + "type": "object", + "properties": { + "newRule": { + "$ref": "#/definitions/dto.AddrRuleOperate" + }, + "oldRule": { + "$ref": "#/definitions/dto.AddrRuleOperate" + } + } + }, + "dto.AppInstallInfo": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.AppResource": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.AppVersion": { + "type": "object", + "properties": { + "detailId": { + "type": "integer" + }, + "dockerCompose": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.BackupInfo": { + "type": "object", + "properties": { + "backupPath": { + "type": "string" + }, + "bucket": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "vars": { + "type": "string" + } + } + }, + "dto.BackupOperate": { + "type": "object", + "required": [ + "type", + "vars" + ], + "properties": { + "accessKey": { + "type": "string" + }, + "backupPath": { + "type": "string" + }, + "bucket": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "vars": { + "type": "string" + } + } + }, + "dto.BackupSearchFile": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + } + }, + "dto.BatchDelete": { + "type": "object", + "required": [ + "names" + ], + "properties": { + "force": { + "type": "boolean" + }, + "names": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.BatchDeleteReq": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.BatchRuleOperate": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PortRuleOperate" + } + }, + "type": { + "type": "string" + } + } + }, + "dto.BindInfo": { + "type": "object", + "required": [ + "bindAddress", + "ipv6" + ], + "properties": { + "bindAddress": { + "type": "string" + }, + "ipv6": { + "type": "string", + "enum": [ + "enable", + "disable" + ] + } + } + }, + "dto.BindUser": { + "type": "object", + "required": [ + "database", + "db", + "password", + "permission", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "db": { + "type": "string" + }, + "password": { + "type": "string" + }, + "permission": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "dto.CaptchaResponse": { + "type": "object", + "properties": { + "captchaID": { + "type": "string" + }, + "imagePath": { + "type": "string" + } + } + }, + "dto.ChangeDBInfo": { + "type": "object", + "required": [ + "database", + "from", + "type", + "value" + ], + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb", + "postgresql" + ] + }, + "value": { + "type": "string" + } + } + }, + "dto.ChangeHostGroup": { + "type": "object", + "required": [ + "groupID", + "id" + ], + "properties": { + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + } + } + }, + "dto.ChangePasswd": { + "type": "object", + "properties": { + "passwd": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.ChangeRedisPass": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "database": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "dto.ClamBaseInfo": { + "type": "object", + "properties": { + "freshIsActive": { + "type": "boolean" + }, + "freshIsExist": { + "type": "boolean" + }, + "freshVersion": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "isExist": { + "type": "boolean" + }, + "version": { + "type": "string" + } + } + }, + "dto.ClamCreate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "infectedDir": { + "type": "string" + }, + "infectedStrategy": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.ClamDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "removeInfected": { + "type": "boolean" + }, + "removeRecord": { + "type": "boolean" + } + } + }, + "dto.ClamFileReq": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "tail": { + "type": "string" + } + } + }, + "dto.ClamLogReq": { + "type": "object", + "properties": { + "clamName": { + "type": "string" + }, + "recordName": { + "type": "string" + }, + "tail": { + "type": "string" + } + } + }, + "dto.ClamLogSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "clamID": { + "type": "integer" + }, + "endTime": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "startTime": { + "type": "string" + } + } + }, + "dto.ClamUpdate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "infectedDir": { + "type": "string" + }, + "infectedStrategy": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "spec": { + "type": "string" + } + } + }, + "dto.ClamUpdateStatus": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "dto.Clean": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "treeType": { + "type": "string" + } + } + }, + "dto.CleanLog": { + "type": "object", + "required": [ + "logType" + ], + "properties": { + "logType": { + "type": "string", + "enum": [ + "login", + "operation" + ] + } + } + }, + "dto.CommandInfo": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "groupBelong": { + "type": "string" + }, + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.CommandOperate": { + "type": "object", + "required": [ + "command", + "name" + ], + "properties": { + "command": { + "type": "string" + }, + "groupBelong": { + "type": "string" + }, + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.CommonBackup": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "detailName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "app", + "mysql", + "mariadb", + "redis", + "website", + "postgresql" + ] + } + } + }, + "dto.CommonRecover": { + "type": "object", + "required": [ + "source", + "type" + ], + "properties": { + "detailName": { + "type": "string" + }, + "file": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "OSS", + "S3", + "SFTP", + "MINIO", + "LOCAL", + "COS", + "KODO", + "OneDrive", + "WebDAV" + ] + }, + "type": { + "type": "string", + "enum": [ + "app", + "mysql", + "mariadb", + "redis", + "website", + "postgresql" + ] + } + } + }, + "dto.ComposeCreate": { + "type": "object", + "required": [ + "from" + ], + "properties": { + "file": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "edit", + "path", + "template" + ] + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "template": { + "type": "integer" + } + } + }, + "dto.ComposeOperation": { + "type": "object", + "required": [ + "name", + "operation", + "path" + ], + "properties": { + "name": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "start", + "stop", + "down" + ] + }, + "path": { + "type": "string" + }, + "withFile": { + "type": "boolean" + } + } + }, + "dto.ComposeTemplateCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "content": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.ComposeTemplateInfo": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.ComposeTemplateUpdate": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "dto.ComposeUpdate": { + "type": "object", + "required": [ + "content", + "name", + "path" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "dto.ContainerCommit": { + "type": "object", + "required": [ + "containerID" + ], + "properties": { + "author": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "containerID": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "newImageName": { + "type": "string" + }, + "pause": { + "type": "boolean" + } + } + }, + "dto.ContainerListStats": { + "type": "object", + "properties": { + "containerID": { + "type": "string" + }, + "cpuPercent": { + "type": "number" + }, + "cpuTotalUsage": { + "type": "integer" + }, + "memoryCache": { + "type": "integer" + }, + "memoryLimit": { + "type": "integer" + }, + "memoryPercent": { + "type": "number" + }, + "memoryUsage": { + "type": "integer" + }, + "percpuUsage": { + "type": "integer" + }, + "systemUsage": { + "type": "integer" + } + } + }, + "dto.ContainerOperate": { + "type": "object", + "required": [ + "image", + "name" + ], + "properties": { + "autoRemove": { + "type": "boolean" + }, + "cmd": { + "type": "array", + "items": { + "type": "string" + } + }, + "containerID": { + "type": "string" + }, + "cpuShares": { + "type": "integer" + }, + "entrypoint": { + "type": "array", + "items": { + "type": "string" + } + }, + "env": { + "type": "array", + "items": { + "type": "string" + } + }, + "exposedPorts": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PortHelper" + } + }, + "forcePull": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "ipv4": { + "type": "string" + }, + "ipv6": { + "type": "string" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "memory": { + "type": "number" + }, + "name": { + "type": "string" + }, + "nanoCPUs": { + "type": "number" + }, + "network": { + "type": "string" + }, + "openStdin": { + "type": "boolean" + }, + "privileged": { + "type": "boolean" + }, + "publishAllPorts": { + "type": "boolean" + }, + "restartPolicy": { + "type": "string" + }, + "tty": { + "type": "boolean" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.VolumeHelper" + } + } + } + }, + "dto.ContainerOperation": { + "type": "object", + "required": [ + "names", + "operation" + ], + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + } + }, + "operation": { + "type": "string", + "enum": [ + "start", + "stop", + "restart", + "kill", + "pause", + "unpause", + "remove" + ] + } + } + }, + "dto.ContainerPrune": { + "type": "object", + "required": [ + "pruneType" + ], + "properties": { + "pruneType": { + "type": "string", + "enum": [ + "container", + "image", + "volume", + "network", + "buildcache" + ] + }, + "withTagAll": { + "type": "boolean" + } + } + }, + "dto.ContainerPruneReport": { + "type": "object", + "properties": { + "deletedNumber": { + "type": "integer" + }, + "spaceReclaimed": { + "type": "integer" + } + } + }, + "dto.ContainerRename": { + "type": "object", + "required": [ + "name", + "newName" + ], + "properties": { + "name": { + "type": "string" + }, + "newName": { + "type": "string" + } + } + }, + "dto.ContainerStats": { + "type": "object", + "properties": { + "cache": { + "type": "number" + }, + "cpuPercent": { + "type": "number" + }, + "ioRead": { + "type": "number" + }, + "ioWrite": { + "type": "number" + }, + "memory": { + "type": "number" + }, + "networkRX": { + "type": "number" + }, + "networkTX": { + "type": "number" + }, + "shotTime": { + "type": "string" + } + } + }, + "dto.ContainerUpgrade": { + "type": "object", + "required": [ + "image", + "name" + ], + "properties": { + "forcePull": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.CronjobBatchDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "cleanData": { + "type": "boolean" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.CronjobClean": { + "type": "object", + "required": [ + "cronjobID" + ], + "properties": { + "cleanData": { + "type": "boolean" + }, + "cronjobID": { + "type": "integer" + }, + "isDelete": { + "type": "boolean" + } + } + }, + "dto.CronjobCreate": { + "type": "object", + "required": [ + "name", + "spec", + "type" + ], + "properties": { + "appID": { + "type": "string" + }, + "backupAccounts": { + "type": "string" + }, + "command": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "dbName": { + "type": "string" + }, + "dbType": { + "type": "string" + }, + "defaultDownload": { + "type": "string" + }, + "exclusionRules": { + "type": "string" + }, + "name": { + "type": "string" + }, + "retainCopies": { + "type": "integer", + "minimum": 1 + }, + "script": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "sourceDir": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "dto.CronjobDownload": { + "type": "object", + "required": [ + "backupAccountID", + "recordID" + ], + "properties": { + "backupAccountID": { + "type": "integer" + }, + "recordID": { + "type": "integer" + } + } + }, + "dto.CronjobUpdate": { + "type": "object", + "required": [ + "id", + "name", + "spec" + ], + "properties": { + "appID": { + "type": "string" + }, + "backupAccounts": { + "type": "string" + }, + "command": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "dbName": { + "type": "string" + }, + "dbType": { + "type": "string" + }, + "defaultDownload": { + "type": "string" + }, + "exclusionRules": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "retainCopies": { + "type": "integer", + "minimum": 1 + }, + "script": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "sourceDir": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "url": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "dto.CronjobUpdateStatus": { + "type": "object", + "required": [ + "id", + "status" + ], + "properties": { + "id": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "dto.DBBaseInfo": { + "type": "object", + "properties": { + "containerName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "port": { + "type": "integer" + } + } + }, + "dto.DBConfUpdateByFile": { + "type": "object", + "required": [ + "database", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "file": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb", + "postgresql", + "redis" + ] + } + } + }, + "dto.DaemonJsonConf": { + "type": "object", + "properties": { + "cgroupDriver": { + "type": "string" + }, + "experimental": { + "type": "boolean" + }, + "fixedCidrV6": { + "type": "string" + }, + "insecureRegistries": { + "type": "array", + "items": { + "type": "string" + } + }, + "ip6Tables": { + "type": "boolean" + }, + "iptables": { + "type": "boolean" + }, + "ipv6": { + "type": "boolean" + }, + "isSwarm": { + "type": "boolean" + }, + "liveRestore": { + "type": "boolean" + }, + "logMaxFile": { + "type": "string" + }, + "logMaxSize": { + "type": "string" + }, + "registryMirrors": { + "type": "array", + "items": { + "type": "string" + } + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DaemonJsonUpdateByFile": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + } + }, + "dto.DashboardBase": { + "type": "object", + "properties": { + "appInstalledNumber": { + "type": "integer" + }, + "cpuCores": { + "type": "integer" + }, + "cpuLogicalCores": { + "type": "integer" + }, + "cpuModelName": { + "type": "string" + }, + "cronjobNumber": { + "type": "integer" + }, + "currentInfo": { + "$ref": "#/definitions/dto.DashboardCurrent" + }, + "databaseNumber": { + "type": "integer" + }, + "hostname": { + "type": "string" + }, + "kernelArch": { + "type": "string" + }, + "kernelVersion": { + "type": "string" + }, + "os": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "platformFamily": { + "type": "string" + }, + "platformVersion": { + "type": "string" + }, + "virtualizationSystem": { + "type": "string" + }, + "websiteNumber": { + "type": "integer" + } + } + }, + "dto.DashboardCurrent": { + "type": "object", + "properties": { + "cpuPercent": { + "type": "array", + "items": { + "type": "number" + } + }, + "cpuTotal": { + "type": "integer" + }, + "cpuUsed": { + "type": "number" + }, + "cpuUsedPercent": { + "type": "number" + }, + "diskData": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.DiskInfo" + } + }, + "gpuData": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.GPUInfo" + } + }, + "ioCount": { + "type": "integer" + }, + "ioReadBytes": { + "type": "integer" + }, + "ioReadTime": { + "type": "integer" + }, + "ioWriteBytes": { + "type": "integer" + }, + "ioWriteTime": { + "type": "integer" + }, + "load1": { + "type": "number" + }, + "load15": { + "type": "number" + }, + "load5": { + "type": "number" + }, + "loadUsagePercent": { + "type": "number" + }, + "memoryAvailable": { + "type": "integer" + }, + "memoryTotal": { + "type": "integer" + }, + "memoryUsed": { + "type": "integer" + }, + "memoryUsedPercent": { + "type": "number" + }, + "netBytesRecv": { + "type": "integer" + }, + "netBytesSent": { + "type": "integer" + }, + "procs": { + "type": "integer" + }, + "shotTime": { + "type": "string" + }, + "swapMemoryAvailable": { + "type": "integer" + }, + "swapMemoryTotal": { + "type": "integer" + }, + "swapMemoryUsed": { + "type": "integer" + }, + "swapMemoryUsedPercent": { + "type": "number" + }, + "timeSinceUptime": { + "type": "string" + }, + "uptime": { + "type": "integer" + } + } + }, + "dto.DatabaseCreate": { + "type": "object", + "required": [ + "from", + "name", + "type", + "username", + "version" + ], + "properties": { + "address": { + "type": "string" + }, + "clientCert": { + "type": "string" + }, + "clientKey": { + "type": "string" + }, + "description": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "name": { + "type": "string", + "maxLength": 256 + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "rootCert": { + "type": "string" + }, + "skipVerify": { + "type": "boolean" + }, + "ssl": { + "type": "boolean" + }, + "type": { + "type": "string" + }, + "username": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DatabaseDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + } + }, + "dto.DatabaseInfo": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "clientCert": { + "type": "string" + }, + "clientKey": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string", + "maxLength": 256 + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "rootCert": { + "type": "string" + }, + "skipVerify": { + "type": "boolean" + }, + "ssl": { + "type": "boolean" + }, + "type": { + "type": "string" + }, + "username": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DatabaseItem": { + "type": "object", + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.DatabaseOption": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "database": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DatabaseSearch": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "dto.DatabaseUpdate": { + "type": "object", + "required": [ + "type", + "username", + "version" + ], + "properties": { + "address": { + "type": "string" + }, + "clientCert": { + "type": "string" + }, + "clientKey": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "rootCert": { + "type": "string" + }, + "skipVerify": { + "type": "boolean" + }, + "ssl": { + "type": "boolean" + }, + "type": { + "type": "string" + }, + "username": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DeviceBaseInfo": { + "type": "object", + "properties": { + "dns": { + "type": "array", + "items": { + "type": "string" + } + }, + "hostname": { + "type": "string" + }, + "hosts": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.HostHelper" + } + }, + "localTime": { + "type": "string" + }, + "maxSize": { + "type": "integer" + }, + "ntp": { + "type": "string" + }, + "swapDetails": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SwapHelper" + } + }, + "swapMemoryAvailable": { + "type": "integer" + }, + "swapMemoryTotal": { + "type": "integer" + }, + "swapMemoryUsed": { + "type": "integer" + }, + "timeZone": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.DiskInfo": { + "type": "object", + "properties": { + "device": { + "type": "string" + }, + "free": { + "type": "integer" + }, + "inodesFree": { + "type": "integer" + }, + "inodesTotal": { + "type": "integer" + }, + "inodesUsed": { + "type": "integer" + }, + "inodesUsedPercent": { + "type": "number" + }, + "path": { + "type": "string" + }, + "total": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "used": { + "type": "integer" + }, + "usedPercent": { + "type": "number" + } + } + }, + "dto.DockerOperation": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string", + "enum": [ + "start", + "restart", + "stop" + ] + } + } + }, + "dto.DownloadRecord": { + "type": "object", + "required": [ + "fileDir", + "fileName", + "source" + ], + "properties": { + "fileDir": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "OSS", + "S3", + "SFTP", + "MINIO", + "LOCAL", + "COS", + "KODO", + "OneDrive", + "WebDAV" + ] + } + } + }, + "dto.Fail2BanBaseInfo": { + "type": "object", + "properties": { + "banAction": { + "type": "string" + }, + "banTime": { + "type": "string" + }, + "findTime": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "isEnable": { + "type": "boolean" + }, + "isExist": { + "type": "boolean" + }, + "logPath": { + "type": "string" + }, + "maxRetry": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "version": { + "type": "string" + } + } + }, + "dto.Fail2BanSearch": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "banned", + "ignore" + ] + } + } + }, + "dto.Fail2BanUpdate": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string", + "enum": [ + "port", + "bantime", + "findtime", + "maxretry", + "banaction", + "logpath", + "port" + ] + }, + "value": { + "type": "string" + } + } + }, + "dto.FirewallBaseInfo": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "pingStatus": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.FirewallOperation": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string", + "enum": [ + "start", + "stop", + "restart", + "disablePing", + "enablePing" + ] + } + } + }, + "dto.ForBuckets": { + "type": "object", + "required": [ + "credential", + "type", + "vars" + ], + "properties": { + "accessKey": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "type": { + "type": "string" + }, + "vars": { + "type": "string" + } + } + }, + "dto.ForwardRuleOperate": { + "type": "object", + "properties": { + "rules": { + "type": "array", + "items": { + "type": "object", + "required": [ + "operation", + "port", + "protocol", + "targetPort" + ], + "properties": { + "num": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "port": { + "type": "string" + }, + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "tcp/udp" + ] + }, + "targetIP": { + "type": "string" + }, + "targetPort": { + "type": "string" + } + } + } + } + } + }, + "dto.FtpBaseInfo": { + "type": "object", + "properties": { + "isActive": { + "type": "boolean" + }, + "isExist": { + "type": "boolean" + } + } + }, + "dto.FtpCreate": { + "type": "object", + "required": [ + "password", + "path", + "user" + ], + "properties": { + "description": { + "type": "string" + }, + "password": { + "type": "string" + }, + "path": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.FtpLogSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "operation": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "user": { + "type": "string" + } + } + }, + "dto.FtpUpdate": { + "type": "object", + "required": [ + "password", + "path" + ], + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string" + }, + "path": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.GPUInfo": { + "type": "object", + "properties": { + "fanSpeed": { + "type": "string" + }, + "gpuUtil": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "maxPowerLimit": { + "type": "string" + }, + "memTotal": { + "type": "string" + }, + "memUsed": { + "type": "string" + }, + "memoryUsage": { + "type": "string" + }, + "performanceState": { + "type": "string" + }, + "powerDraw": { + "type": "string" + }, + "powerUsage": { + "type": "string" + }, + "productName": { + "type": "string" + }, + "temperature": { + "type": "string" + } + } + }, + "dto.GenerateLoad": { + "type": "object", + "required": [ + "encryptionMode" + ], + "properties": { + "encryptionMode": { + "type": "string", + "enum": [ + "rsa", + "ed25519", + "ecdsa", + "dsa" + ] + } + } + }, + "dto.GenerateSSH": { + "type": "object", + "required": [ + "encryptionMode" + ], + "properties": { + "encryptionMode": { + "type": "string", + "enum": [ + "rsa", + "ed25519", + "ecdsa", + "dsa" + ] + }, + "password": { + "type": "string" + } + } + }, + "dto.GroupCreate": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.GroupInfo": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "isDefault": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.GroupSearch": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + } + }, + "dto.GroupUpdate": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "id": { + "type": "integer" + }, + "isDefault": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.HostConnTest": { + "type": "object", + "required": [ + "addr", + "port", + "user" + ], + "properties": { + "addr": { + "type": "string" + }, + "authMode": { + "type": "string", + "enum": [ + "password", + "key" + ] + }, + "passPhrase": { + "type": "string" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer", + "maximum": 65535, + "minimum": 1 + }, + "privateKey": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.HostHelper": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "ip": { + "type": "string" + } + } + }, + "dto.HostOperate": { + "type": "object", + "required": [ + "addr", + "port", + "user" + ], + "properties": { + "addr": { + "type": "string" + }, + "authMode": { + "type": "string", + "enum": [ + "password", + "key" + ] + }, + "description": { + "type": "string" + }, + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "passPhrase": { + "type": "string" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer", + "maximum": 65535, + "minimum": 1 + }, + "privateKey": { + "type": "string" + }, + "rememberPassword": { + "type": "boolean" + }, + "user": { + "type": "string" + } + } + }, + "dto.HostTree": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.TreeChild" + } + }, + "id": { + "type": "integer" + }, + "label": { + "type": "string" + } + } + }, + "dto.ImageBuild": { + "type": "object", + "required": [ + "dockerfile", + "from", + "name" + ], + "properties": { + "dockerfile": { + "type": "string" + }, + "from": { + "type": "string" + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.ImageInfo": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isUsed": { + "type": "boolean" + }, + "size": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.ImageLoad": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "dto.ImagePull": { + "type": "object", + "required": [ + "imageName" + ], + "properties": { + "imageName": { + "type": "string" + }, + "repoID": { + "type": "integer" + } + } + }, + "dto.ImagePush": { + "type": "object", + "required": [ + "name", + "repoID", + "tagName" + ], + "properties": { + "name": { + "type": "string" + }, + "repoID": { + "type": "integer" + }, + "tagName": { + "type": "string" + } + } + }, + "dto.ImageRepoDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.ImageRepoOption": { + "type": "object", + "properties": { + "downloadUrl": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.ImageRepoUpdate": { + "type": "object", + "properties": { + "auth": { + "type": "boolean" + }, + "downloadUrl": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string", + "maxLength": 256 + }, + "protocol": { + "type": "string" + }, + "username": { + "type": "string", + "maxLength": 256 + } + } + }, + "dto.ImageSave": { + "type": "object", + "required": [ + "name", + "path", + "tagName" + ], + "properties": { + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "tagName": { + "type": "string" + } + } + }, + "dto.ImageTag": { + "type": "object", + "required": [ + "sourceID", + "targetName" + ], + "properties": { + "sourceID": { + "type": "string" + }, + "targetName": { + "type": "string" + } + } + }, + "dto.InspectReq": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.LogOption": { + "type": "object", + "properties": { + "logMaxFile": { + "type": "string" + }, + "logMaxSize": { + "type": "string" + } + } + }, + "dto.Login": { + "type": "object", + "required": [ + "authMethod", + "language", + "name", + "password" + ], + "properties": { + "authMethod": { + "type": "string", + "enum": [ + "jwt", + "session" + ] + }, + "captcha": { + "type": "string" + }, + "captchaID": { + "type": "string" + }, + "ignoreCaptcha": { + "type": "boolean" + }, + "language": { + "type": "string", + "enum": [ + "zh", + "en", + "tw" + ] + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "dto.MFALogin": { + "type": "object", + "required": [ + "code", + "name", + "password" + ], + "properties": { + "authMethod": { + "type": "string" + }, + "code": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "dto.MfaCredential": { + "type": "object", + "required": [ + "code", + "interval", + "secret" + ], + "properties": { + "code": { + "type": "string" + }, + "interval": { + "type": "string" + }, + "secret": { + "type": "string" + } + } + }, + "dto.MonitorSearch": { + "type": "object", + "required": [ + "param" + ], + "properties": { + "endTime": { + "type": "string" + }, + "info": { + "type": "string" + }, + "param": { + "type": "string", + "enum": [ + "all", + "cpu", + "memory", + "load", + "io", + "network" + ] + }, + "startTime": { + "type": "string" + } + } + }, + "dto.MysqlDBCreate": { + "type": "object", + "required": [ + "database", + "format", + "from", + "name", + "password", + "permission", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "description": { + "type": "string" + }, + "format": { + "type": "string", + "enum": [ + "utf8mb4", + "utf8", + "gbk", + "big5" + ] + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "permission": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "dto.MysqlDBDelete": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + } + } + }, + "dto.MysqlDBDeleteCheck": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + } + } + }, + "dto.MysqlDBSearch": { + "type": "object", + "required": [ + "database", + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "database": { + "type": "string" + }, + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.MysqlLoadDB": { + "type": "object", + "required": [ + "database", + "from", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + } + } + }, + "dto.MysqlOption": { + "type": "object", + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.MysqlStatus": { + "type": "object", + "properties": { + "Aborted_clients": { + "type": "string" + }, + "Aborted_connects": { + "type": "string" + }, + "Bytes_received": { + "type": "string" + }, + "Bytes_sent": { + "type": "string" + }, + "Com_commit": { + "type": "string" + }, + "Com_rollback": { + "type": "string" + }, + "Connections": { + "type": "string" + }, + "Created_tmp_disk_tables": { + "type": "string" + }, + "Created_tmp_tables": { + "type": "string" + }, + "File": { + "type": "string" + }, + "Innodb_buffer_pool_pages_dirty": { + "type": "string" + }, + "Innodb_buffer_pool_read_requests": { + "type": "string" + }, + "Innodb_buffer_pool_reads": { + "type": "string" + }, + "Key_read_requests": { + "type": "string" + }, + "Key_reads": { + "type": "string" + }, + "Key_write_requests": { + "type": "string" + }, + "Key_writes": { + "type": "string" + }, + "Max_used_connections": { + "type": "string" + }, + "Open_tables": { + "type": "string" + }, + "Opened_files": { + "type": "string" + }, + "Opened_tables": { + "type": "string" + }, + "Position": { + "type": "string" + }, + "Qcache_hits": { + "type": "string" + }, + "Qcache_inserts": { + "type": "string" + }, + "Questions": { + "type": "string" + }, + "Run": { + "type": "string" + }, + "Select_full_join": { + "type": "string" + }, + "Select_range_check": { + "type": "string" + }, + "Sort_merge_passes": { + "type": "string" + }, + "Table_locks_waited": { + "type": "string" + }, + "Threads_cached": { + "type": "string" + }, + "Threads_connected": { + "type": "string" + }, + "Threads_created": { + "type": "string" + }, + "Threads_running": { + "type": "string" + }, + "Uptime": { + "type": "string" + } + } + }, + "dto.MysqlVariables": { + "type": "object", + "properties": { + "binlog_cache_size": { + "type": "string" + }, + "innodb_buffer_pool_size": { + "type": "string" + }, + "innodb_log_buffer_size": { + "type": "string" + }, + "join_buffer_size": { + "type": "string" + }, + "key_buffer_size": { + "type": "string" + }, + "long_query_time": { + "type": "string" + }, + "max_connections": { + "type": "string" + }, + "max_heap_table_size": { + "type": "string" + }, + "query_cache_size": { + "type": "string" + }, + "query_cache_type": { + "type": "string" + }, + "read_buffer_size": { + "type": "string" + }, + "read_rnd_buffer_size": { + "type": "string" + }, + "slow_query_log": { + "type": "string" + }, + "sort_buffer_size": { + "type": "string" + }, + "table_open_cache": { + "type": "string" + }, + "thread_cache_size": { + "type": "string" + }, + "thread_stack": { + "type": "string" + }, + "tmp_table_size": { + "type": "string" + } + } + }, + "dto.MysqlVariablesUpdate": { + "type": "object", + "required": [ + "database", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MysqlVariablesUpdateHelper" + } + } + } + }, + "dto.MysqlVariablesUpdateHelper": { + "type": "object", + "properties": { + "param": { + "type": "string" + }, + "value": {} + } + }, + "dto.NetworkCreate": { + "type": "object", + "required": [ + "driver", + "name" + ], + "properties": { + "auxAddress": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SettingUpdate" + } + }, + "auxAddressV6": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SettingUpdate" + } + }, + "driver": { + "type": "string" + }, + "gateway": { + "type": "string" + }, + "gatewayV6": { + "type": "string" + }, + "ipRange": { + "type": "string" + }, + "ipRangeV6": { + "type": "string" + }, + "ipv4": { + "type": "boolean" + }, + "ipv6": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string" + } + }, + "subnet": { + "type": "string" + }, + "subnetV6": { + "type": "string" + } + } + }, + "dto.NginxKey": { + "type": "string", + "enum": [ + "index", + "limit-conn", + "ssl", + "cache", + "http-per", + "proxy-cache" + ], + "x-enum-varnames": [ + "Index", + "LimitConn", + "SSL", + "CACHE", + "HttpPer", + "ProxyCache" + ] + }, + "dto.OneDriveInfo": { + "type": "object", + "properties": { + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + }, + "redirect_uri": { + "type": "string" + } + } + }, + "dto.Operate": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string" + } + } + }, + "dto.OperateByID": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "dto.OperationWithName": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + } + } + }, + "dto.OperationWithNameAndType": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.Options": { + "type": "object", + "properties": { + "option": { + "type": "string" + } + } + }, + "dto.OsInfo": { + "type": "object", + "properties": { + "diskSize": { + "type": "integer" + }, + "kernelArch": { + "type": "string" + }, + "kernelVersion": { + "type": "string" + }, + "os": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "platformFamily": { + "type": "string" + } + } + }, + "dto.PageContainer": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize", + "state" + ], + "properties": { + "excludeAppStore": { + "type": "boolean" + }, + "filters": { + "type": "string" + }, + "name": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "state", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "state": { + "type": "string", + "enum": [ + "all", + "created", + "running", + "paused", + "restarting", + "removing", + "exited", + "dead" + ] + } + } + }, + "dto.PageCronjob": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "status", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.PageInfo": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.PageResult": { + "type": "object", + "properties": { + "items": {}, + "total": { + "type": "integer" + } + } + }, + "dto.PasswordUpdate": { + "type": "object", + "required": [ + "newPassword", + "oldPassword" + ], + "properties": { + "newPassword": { + "type": "string" + }, + "oldPassword": { + "type": "string" + } + } + }, + "dto.PortHelper": { + "type": "object", + "properties": { + "containerPort": { + "type": "string" + }, + "hostIP": { + "type": "string" + }, + "hostPort": { + "type": "string" + }, + "protocol": { + "type": "string" + } + } + }, + "dto.PortRuleOperate": { + "type": "object", + "required": [ + "operation", + "port", + "protocol", + "strategy" + ], + "properties": { + "address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "port": { + "type": "string" + }, + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "tcp/udp" + ] + }, + "strategy": { + "type": "string", + "enum": [ + "accept", + "drop" + ] + } + } + }, + "dto.PortRuleUpdate": { + "type": "object", + "properties": { + "newRule": { + "$ref": "#/definitions/dto.PortRuleOperate" + }, + "oldRule": { + "$ref": "#/definitions/dto.PortRuleOperate" + } + } + }, + "dto.PortUpdate": { + "type": "object", + "required": [ + "serverPort" + ], + "properties": { + "serverPort": { + "type": "integer", + "maximum": 65535, + "minimum": 1 + } + } + }, + "dto.PostgresqlBindUser": { + "type": "object", + "required": [ + "database", + "name", + "password", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "superUser": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "dto.PostgresqlDBCreate": { + "type": "object", + "required": [ + "database", + "from", + "name", + "password", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "description": { + "type": "string" + }, + "format": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "superUser": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "dto.PostgresqlDBDelete": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "postgresql" + ] + } + } + }, + "dto.PostgresqlDBDeleteCheck": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "postgresql" + ] + } + } + }, + "dto.PostgresqlDBSearch": { + "type": "object", + "required": [ + "database", + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "database": { + "type": "string" + }, + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.PostgresqlLoadDB": { + "type": "object", + "required": [ + "database", + "from", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "type": { + "type": "string", + "enum": [ + "postgresql" + ] + } + } + }, + "dto.ProxyUpdate": { + "type": "object", + "properties": { + "proxyPasswd": { + "type": "string" + }, + "proxyPasswdKeep": { + "type": "string" + }, + "proxyPort": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "proxyUrl": { + "type": "string" + }, + "proxyUser": { + "type": "string" + } + } + }, + "dto.RecordSearch": { + "type": "object", + "required": [ + "page", + "pageSize", + "type" + ], + "properties": { + "detailName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "dto.RecordSearchByCronjob": { + "type": "object", + "required": [ + "cronjobID", + "page", + "pageSize" + ], + "properties": { + "cronjobID": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.RedisCommand": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.RedisConf": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "containerName": { + "type": "string" + }, + "database": { + "type": "string" + }, + "maxclients": { + "type": "string" + }, + "maxmemory": { + "type": "string" + }, + "name": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "requirepass": { + "type": "string" + }, + "timeout": { + "type": "string" + } + } + }, + "dto.RedisConfPersistenceUpdate": { + "type": "object", + "required": [ + "database", + "type" + ], + "properties": { + "appendfsync": { + "type": "string" + }, + "appendonly": { + "type": "string" + }, + "database": { + "type": "string" + }, + "save": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "aof", + "rbd" + ] + } + } + }, + "dto.RedisConfUpdate": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "database": { + "type": "string" + }, + "maxclients": { + "type": "string" + }, + "maxmemory": { + "type": "string" + }, + "timeout": { + "type": "string" + } + } + }, + "dto.RedisPersistence": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "appendfsync": { + "type": "string" + }, + "appendonly": { + "type": "string" + }, + "database": { + "type": "string" + }, + "save": { + "type": "string" + } + } + }, + "dto.RedisStatus": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "connected_clients": { + "type": "string" + }, + "database": { + "type": "string" + }, + "instantaneous_ops_per_sec": { + "type": "string" + }, + "keyspace_hits": { + "type": "string" + }, + "keyspace_misses": { + "type": "string" + }, + "latest_fork_usec": { + "type": "string" + }, + "mem_fragmentation_ratio": { + "type": "string" + }, + "tcp_port": { + "type": "string" + }, + "total_commands_processed": { + "type": "string" + }, + "total_connections_received": { + "type": "string" + }, + "uptime_in_days": { + "type": "string" + }, + "used_memory": { + "type": "string" + }, + "used_memory_peak": { + "type": "string" + }, + "used_memory_rss": { + "type": "string" + } + } + }, + "dto.ResourceLimit": { + "type": "object", + "properties": { + "cpu": { + "type": "integer" + }, + "memory": { + "type": "integer" + } + } + }, + "dto.RuleSearch": { + "type": "object", + "required": [ + "page", + "pageSize", + "type" + ], + "properties": { + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "strategy": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.SSHConf": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + } + }, + "dto.SSHHistory": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "area": { + "type": "string" + }, + "authMode": { + "type": "string" + }, + "date": { + "type": "string" + }, + "dateStr": { + "type": "string" + }, + "message": { + "type": "string" + }, + "port": { + "type": "string" + }, + "status": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.SSHInfo": { + "type": "object", + "properties": { + "autoStart": { + "type": "boolean" + }, + "listenAddress": { + "type": "string" + }, + "message": { + "type": "string" + }, + "passwordAuthentication": { + "type": "string" + }, + "permitRootLogin": { + "type": "string" + }, + "port": { + "type": "string" + }, + "pubkeyAuthentication": { + "type": "string" + }, + "status": { + "type": "string" + }, + "useDNS": { + "type": "string" + } + } + }, + "dto.SSHLog": { + "type": "object", + "properties": { + "failedCount": { + "type": "integer" + }, + "logs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SSHHistory" + } + }, + "successfulCount": { + "type": "integer" + }, + "totalCount": { + "type": "integer" + } + } + }, + "dto.SSHUpdate": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string" + }, + "newValue": { + "type": "string" + }, + "oldValue": { + "type": "string" + } + } + }, + "dto.SSLUpdate": { + "type": "object", + "required": [ + "ssl", + "sslType" + ], + "properties": { + "cert": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "key": { + "type": "string" + }, + "ssl": { + "type": "string", + "enum": [ + "enable", + "disable" + ] + }, + "sslID": { + "type": "integer" + }, + "sslType": { + "type": "string", + "enum": [ + "self", + "select", + "import", + "import-paste", + "import-local" + ] + } + } + }, + "dto.SearchForTree": { + "type": "object", + "properties": { + "info": { + "type": "string" + } + } + }, + "dto.SearchHostWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "groupID": { + "type": "integer" + }, + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.SearchLgLogWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "ip": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "dto.SearchOpLogWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "operation": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "source": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.SearchRecord": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "cronjobID": { + "type": "integer" + }, + "endTime": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "startTime": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.SearchSSHLog": { + "type": "object", + "required": [ + "Status", + "page", + "pageSize" + ], + "properties": { + "Status": { + "type": "string", + "enum": [ + "Success", + "Failed", + "All" + ] + }, + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.SearchWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.SettingInfo": { + "type": "object", + "properties": { + "allowIPs": { + "type": "string" + }, + "appStoreLastModified": { + "type": "string" + }, + "appStoreSyncStatus": { + "type": "string" + }, + "appStoreVersion": { + "type": "string" + }, + "bindAddress": { + "type": "string" + }, + "bindDomain": { + "type": "string" + }, + "complexityVerification": { + "type": "string" + }, + "defaultNetwork": { + "type": "string" + }, + "developerMode": { + "type": "string" + }, + "dingVars": { + "type": "string" + }, + "dockerSockPath": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVars": { + "type": "string" + }, + "expirationDays": { + "type": "string" + }, + "expirationTime": { + "type": "string" + }, + "fileRecycleBin": { + "type": "string" + }, + "ipv6": { + "type": "string" + }, + "language": { + "type": "string" + }, + "lastCleanData": { + "type": "string" + }, + "lastCleanSize": { + "type": "string" + }, + "lastCleanTime": { + "type": "string" + }, + "localTime": { + "type": "string" + }, + "menuTabs": { + "type": "string" + }, + "messageType": { + "type": "string" + }, + "mfaInterval": { + "type": "string" + }, + "mfaSecret": { + "type": "string" + }, + "mfaStatus": { + "type": "string" + }, + "monitorInterval": { + "type": "string" + }, + "monitorStatus": { + "type": "string" + }, + "monitorStoreDays": { + "type": "string" + }, + "noAuthSetting": { + "type": "string" + }, + "ntpSite": { + "type": "string" + }, + "panelName": { + "type": "string" + }, + "port": { + "type": "string" + }, + "proxyPasswd": { + "type": "string" + }, + "proxyPasswdKeep": { + "type": "string" + }, + "proxyPort": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "proxyUrl": { + "type": "string" + }, + "proxyUser": { + "type": "string" + }, + "securityEntrance": { + "type": "string" + }, + "serverPort": { + "type": "string" + }, + "sessionTimeout": { + "type": "string" + }, + "snapshotIgnore": { + "type": "string" + }, + "ssl": { + "type": "string" + }, + "sslType": { + "type": "string" + }, + "systemIP": { + "type": "string" + }, + "systemVersion": { + "type": "string" + }, + "theme": { + "type": "string" + }, + "timeZone": { + "type": "string" + }, + "userName": { + "type": "string" + }, + "weChatVars": { + "type": "string" + }, + "xpackHideMenu": { + "type": "string" + } + } + }, + "dto.SettingUpdate": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "dto.SnapshotBatchDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "deleteWithFile": { + "type": "boolean" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.SnapshotCreate": { + "type": "object", + "required": [ + "defaultDownload", + "from" + ], + "properties": { + "defaultDownload": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "secret": { + "type": "string" + } + } + }, + "dto.SnapshotImport": { + "type": "object", + "properties": { + "description": { + "type": "string", + "maxLength": 256 + }, + "from": { + "type": "string" + }, + "names": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.SnapshotRecover": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "isNew": { + "type": "boolean" + }, + "reDownload": { + "type": "boolean" + }, + "secret": { + "type": "string" + } + } + }, + "dto.SwapHelper": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "isNew": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "used": { + "type": "string" + } + } + }, + "dto.TreeChild": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "label": { + "type": "string" + } + } + }, + "dto.UpdateByFile": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + } + }, + "dto.UpdateByNameAndFile": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.UpdateDescription": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "description": { + "type": "string", + "maxLength": 256 + }, + "id": { + "type": "integer" + } + } + }, + "dto.UpdateFirewallDescription": { + "type": "object", + "required": [ + "strategy" + ], + "properties": { + "address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "port": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "strategy": { + "type": "string", + "enum": [ + "accept", + "drop" + ] + }, + "type": { + "type": "string" + } + } + }, + "dto.Upgrade": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string" + } + } + }, + "dto.UpgradeInfo": { + "type": "object", + "properties": { + "latestVersion": { + "type": "string" + }, + "newVersion": { + "type": "string" + }, + "releaseNote": { + "type": "string" + }, + "testVersion": { + "type": "string" + } + } + }, + "dto.UserLoginInfo": { + "type": "object", + "properties": { + "mfaStatus": { + "type": "string" + }, + "name": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "dto.VolumeCreate": { + "type": "object", + "required": [ + "driver", + "name" + ], + "properties": { + "driver": { + "type": "string" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.VolumeHelper": { + "type": "object", + "properties": { + "containerDir": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "sourceDir": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "files.FileInfo": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "favoriteID": { + "type": "integer" + }, + "gid": { + "type": "string" + }, + "group": { + "type": "string" + }, + "isDetail": { + "type": "boolean" + }, + "isDir": { + "type": "boolean" + }, + "isHidden": { + "type": "boolean" + }, + "isSymlink": { + "type": "boolean" + }, + "itemTotal": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/files.FileInfo" + } + }, + "linkPath": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "modTime": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "updateTime": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "mfa.Otp": { + "type": "object", + "properties": { + "qrImage": { + "type": "string" + }, + "secret": { + "type": "string" + } + } + }, + "model.App": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "crossVersionUpdate": { + "type": "boolean" + }, + "document": { + "type": "string" + }, + "github": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "lastModified": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "readMe": { + "type": "string" + }, + "recommend": { + "type": "integer" + }, + "required": { + "type": "string" + }, + "resource": { + "type": "string" + }, + "shortDescEn": { + "type": "string" + }, + "shortDescZh": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "model.AppInstall": { + "type": "object", + "properties": { + "app": { + "$ref": "#/definitions/model.App" + }, + "appDetailId": { + "type": "integer" + }, + "appId": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dockerCompose": { + "type": "string" + }, + "env": { + "type": "string" + }, + "httpPort": { + "type": "integer" + }, + "httpsPort": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "param": { + "type": "string" + }, + "serviceName": { + "type": "string" + }, + "status": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "model.Tag": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "sort": { + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + }, + "model.Website": { + "type": "object", + "properties": { + "IPV6": { + "type": "boolean" + }, + "accessLog": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "appInstallId": { + "type": "integer" + }, + "createdAt": { + "type": "string" + }, + "defaultServer": { + "type": "boolean" + }, + "domains": { + "type": "array", + "items": { + "$ref": "#/definitions/model.WebsiteDomain" + } + }, + "errorLog": { + "type": "boolean" + }, + "expireDate": { + "type": "string" + }, + "ftpId": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "httpConfig": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "rewrite": { + "type": "string" + }, + "runtimeID": { + "type": "integer" + }, + "siteDir": { + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "user": { + "type": "string" + }, + "webSiteGroupId": { + "type": "integer" + }, + "webSiteSSL": { + "$ref": "#/definitions/model.WebsiteSSL" + }, + "webSiteSSLId": { + "type": "integer" + } + } + }, + "model.WebsiteAcmeAccount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "eabHmacKey": { + "type": "string" + }, + "eabKid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "model.WebsiteDnsAccount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "model.WebsiteDomain": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "updatedAt": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "model.WebsiteSSL": { + "type": "object", + "properties": { + "acmeAccount": { + "$ref": "#/definitions/model.WebsiteAcmeAccount" + }, + "acmeAccountId": { + "type": "integer" + }, + "autoRenew": { + "type": "boolean" + }, + "caId": { + "type": "integer" + }, + "certURL": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "disableCNAME": { + "type": "boolean" + }, + "dnsAccount": { + "$ref": "#/definitions/model.WebsiteDnsAccount" + }, + "dnsAccountId": { + "type": "integer" + }, + "domains": { + "type": "string" + }, + "execShell": { + "type": "boolean" + }, + "expireDate": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "message": { + "type": "string" + }, + "nameserver1": { + "type": "string" + }, + "nameserver2": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "pem": { + "type": "string" + }, + "primaryDomain": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "pushDir": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "skipDNS": { + "type": "boolean" + }, + "startDate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "websites": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Website" + } + } + } + }, + "request.AppInstallCreate": { + "type": "object", + "required": [ + "appDetailId", + "name" + ], + "properties": { + "advanced": { + "type": "boolean" + }, + "allowPort": { + "type": "boolean" + }, + "appDetailId": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "cpuQuota": { + "type": "number" + }, + "dockerCompose": { + "type": "string" + }, + "editCompose": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "memoryLimit": { + "type": "number" + }, + "memoryUnit": { + "type": "string" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "pullImage": { + "type": "boolean" + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "request.AppInstalledIgnoreUpgrade": { + "type": "object", + "required": [ + "detailID", + "operate" + ], + "properties": { + "detailID": { + "type": "integer" + }, + "operate": { + "type": "string", + "enum": [ + "cancel", + "ignore" + ] + } + } + }, + "request.AppInstalledInfo": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "request.AppInstalledOperate": { + "type": "object", + "required": [ + "installId", + "operate" + ], + "properties": { + "backup": { + "type": "boolean" + }, + "backupId": { + "type": "integer" + }, + "deleteBackup": { + "type": "boolean" + }, + "deleteDB": { + "type": "boolean" + }, + "detailId": { + "type": "integer" + }, + "dockerCompose": { + "type": "string" + }, + "forceDelete": { + "type": "boolean" + }, + "installId": { + "type": "integer" + }, + "operate": { + "type": "string" + }, + "pullImage": { + "type": "boolean" + } + } + }, + "request.AppInstalledSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "all": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "sync": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + }, + "unused": { + "type": "boolean" + }, + "update": { + "type": "boolean" + } + } + }, + "request.AppInstalledUpdate": { + "type": "object", + "required": [ + "installId", + "params" + ], + "properties": { + "advanced": { + "type": "boolean" + }, + "allowPort": { + "type": "boolean" + }, + "containerName": { + "type": "string" + }, + "cpuQuota": { + "type": "number" + }, + "dockerCompose": { + "type": "string" + }, + "editCompose": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "installId": { + "type": "integer" + }, + "memoryLimit": { + "type": "number" + }, + "memoryUnit": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "pullImage": { + "type": "boolean" + } + } + }, + "request.AppSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "recommend": { + "type": "boolean" + }, + "resource": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "request.DirSizeReq": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "request.ExposedPort": { + "type": "object", + "properties": { + "containerPort": { + "type": "integer" + }, + "hostPort": { + "type": "integer" + } + } + }, + "request.FavoriteCreate": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "request.FavoriteDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.FileBatchDelete": { + "type": "object", + "required": [ + "paths" + ], + "properties": { + "isDir": { + "type": "boolean" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "request.FileCompress": { + "type": "object", + "required": [ + "dst", + "files", + "name", + "type" + ], + "properties": { + "dst": { + "type": "string" + }, + "files": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "replace": { + "type": "boolean" + }, + "secret": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.FileContentReq": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "isDetail": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "request.FileCreate": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "content": { + "type": "string" + }, + "isDir": { + "type": "boolean" + }, + "isLink": { + "type": "boolean" + }, + "isSymlink": { + "type": "boolean" + }, + "linkPath": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "sub": { + "type": "boolean" + } + } + }, + "request.FileDeCompress": { + "type": "object", + "required": [ + "dst", + "path", + "type" + ], + "properties": { + "dst": { + "type": "string" + }, + "path": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.FileDelete": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "forceDelete": { + "type": "boolean" + }, + "isDir": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "request.FileDownload": { + "type": "object", + "required": [ + "name", + "paths", + "type" + ], + "properties": { + "compress": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "request.FileEdit": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "content": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "request.FileMove": { + "type": "object", + "required": [ + "newPath", + "oldPaths", + "type" + ], + "properties": { + "cover": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "newPath": { + "type": "string" + }, + "oldPaths": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "request.FileOption": { + "type": "object", + "properties": { + "containSub": { + "type": "boolean" + }, + "dir": { + "type": "boolean" + }, + "expand": { + "type": "boolean" + }, + "isDetail": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "search": { + "type": "string" + }, + "showHidden": { + "type": "boolean" + }, + "sortBy": { + "type": "string" + }, + "sortOrder": { + "type": "string" + } + } + }, + "request.FilePathCheck": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "request.FileReadByLineReq": { + "type": "object", + "required": [ + "page", + "pageSize", + "type" + ], + "properties": { + "ID": { + "type": "integer" + }, + "latest": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "request.FileRename": { + "type": "object", + "required": [ + "newName", + "oldName" + ], + "properties": { + "newName": { + "type": "string" + }, + "oldName": { + "type": "string" + } + } + }, + "request.FileRoleReq": { + "type": "object", + "required": [ + "group", + "mode", + "paths", + "user" + ], + "properties": { + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "sub": { + "type": "boolean" + }, + "user": { + "type": "string" + } + } + }, + "request.FileRoleUpdate": { + "type": "object", + "required": [ + "group", + "path", + "user" + ], + "properties": { + "group": { + "type": "string" + }, + "path": { + "type": "string" + }, + "sub": { + "type": "boolean" + }, + "user": { + "type": "string" + } + } + }, + "request.FileWget": { + "type": "object", + "required": [ + "name", + "path", + "url" + ], + "properties": { + "ignoreCertificate": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "request.HostToolConfig": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "operate": { + "type": "string", + "enum": [ + "get", + "set" + ] + }, + "type": { + "type": "string", + "enum": [ + "supervisord" + ] + } + } + }, + "request.HostToolCreate": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "configPath": { + "type": "string" + }, + "serviceName": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.HostToolLogReq": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "supervisord" + ] + } + } + }, + "request.HostToolReq": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "operate": { + "type": "string", + "enum": [ + "status", + "restart", + "start", + "stop" + ] + }, + "type": { + "type": "string", + "enum": [ + "supervisord" + ] + } + } + }, + "request.NewAppInstall": { + "type": "object", + "properties": { + "advanced": { + "type": "boolean" + }, + "allowPort": { + "type": "boolean" + }, + "appDetailID": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "cpuQuota": { + "type": "number" + }, + "dockerCompose": { + "type": "string" + }, + "editCompose": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "memoryLimit": { + "type": "number" + }, + "memoryUnit": { + "type": "string" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "pullImage": { + "type": "boolean" + } + } + }, + "request.NginxAntiLeechUpdate": { + "type": "object", + "required": [ + "extends", + "return", + "websiteID" + ], + "properties": { + "blocked": { + "type": "boolean" + }, + "cache": { + "type": "boolean" + }, + "cacheTime": { + "type": "integer" + }, + "cacheUint": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "extends": { + "type": "string" + }, + "logEnable": { + "type": "boolean" + }, + "noneRef": { + "type": "boolean" + }, + "return": { + "type": "string" + }, + "serverNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxAuthReq": { + "type": "object", + "required": [ + "websiteID" + ], + "properties": { + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxAuthUpdate": { + "type": "object", + "required": [ + "operate", + "websiteID" + ], + "properties": { + "operate": { + "type": "string" + }, + "password": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "username": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxCommonReq": { + "type": "object", + "required": [ + "websiteID" + ], + "properties": { + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxConfigFileUpdate": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "backup": { + "type": "boolean" + }, + "content": { + "type": "string" + } + } + }, + "request.NginxConfigUpdate": { + "type": "object", + "required": [ + "operate" + ], + "properties": { + "operate": { + "type": "string", + "enum": [ + "add", + "update", + "delete" + ] + }, + "params": {}, + "scope": { + "$ref": "#/definitions/dto.NginxKey" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxProxyUpdate": { + "type": "object", + "required": [ + "content", + "name", + "websiteID" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxRedirectReq": { + "type": "object", + "required": [ + "name", + "operate", + "redirect", + "target", + "type", + "websiteID" + ], + "properties": { + "domains": { + "type": "array", + "items": { + "type": "string" + } + }, + "enable": { + "type": "boolean" + }, + "keepPath": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "path": { + "type": "string" + }, + "redirect": { + "type": "string" + }, + "redirectRoot": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "type": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxRedirectUpdate": { + "type": "object", + "required": [ + "content", + "name", + "websiteID" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxRewriteReq": { + "type": "object", + "required": [ + "name", + "websiteId" + ], + "properties": { + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxRewriteUpdate": { + "type": "object", + "required": [ + "name", + "websiteId" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxScopeReq": { + "type": "object", + "required": [ + "scope" + ], + "properties": { + "scope": { + "$ref": "#/definitions/dto.NginxKey" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NodeModuleReq": { + "type": "object", + "required": [ + "ID" + ], + "properties": { + "ID": { + "type": "integer" + } + } + }, + "request.NodePackageReq": { + "type": "object", + "properties": { + "codeDir": { + "type": "string" + } + } + }, + "request.PHPExtensionsCreate": { + "type": "object", + "required": [ + "extensions", + "name" + ], + "properties": { + "extensions": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "request.PHPExtensionsDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.PHPExtensionsSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "all": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.PHPExtensionsUpdate": { + "type": "object", + "required": [ + "extensions", + "id" + ], + "properties": { + "extensions": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "request.PortUpdate": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "port": { + "type": "integer" + } + } + }, + "request.ProcessReq": { + "type": "object", + "required": [ + "PID" + ], + "properties": { + "PID": { + "type": "integer" + } + } + }, + "request.RecycleBinReduce": { + "type": "object", + "required": [ + "from", + "rName" + ], + "properties": { + "from": { + "type": "string" + }, + "name": { + "type": "string" + }, + "rName": { + "type": "string" + } + } + }, + "request.RuntimeCreate": { + "type": "object", + "properties": { + "appDetailId": { + "type": "integer" + }, + "clean": { + "type": "boolean" + }, + "codeDir": { + "type": "string" + }, + "exposedPorts": { + "type": "array", + "items": { + "$ref": "#/definitions/request.ExposedPort" + } + }, + "image": { + "type": "string" + }, + "install": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "port": { + "type": "integer" + }, + "resource": { + "type": "string" + }, + "source": { + "type": "string" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "request.RuntimeDelete": { + "type": "object", + "properties": { + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + } + }, + "request.RuntimeOperate": { + "type": "object", + "properties": { + "ID": { + "type": "integer" + }, + "operate": { + "type": "string" + } + } + }, + "request.RuntimeSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.RuntimeUpdate": { + "type": "object", + "properties": { + "clean": { + "type": "boolean" + }, + "codeDir": { + "type": "string" + }, + "exposedPorts": { + "type": "array", + "items": { + "$ref": "#/definitions/request.ExposedPort" + } + }, + "id": { + "type": "integer" + }, + "image": { + "type": "string" + }, + "install": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "port": { + "type": "integer" + }, + "rebuild": { + "type": "boolean" + }, + "source": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "request.SearchUploadWithPage": { + "type": "object", + "required": [ + "page", + "pageSize", + "path" + ], + "properties": { + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "path": { + "type": "string" + } + } + }, + "request.SupervisorProcessConfig": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "name": { + "type": "string" + }, + "numprocs": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "request.SupervisorProcessFileReq": { + "type": "object", + "required": [ + "file", + "name", + "operate" + ], + "properties": { + "content": { + "type": "string" + }, + "file": { + "type": "string", + "enum": [ + "out.log", + "err.log", + "config" + ] + }, + "name": { + "type": "string" + }, + "operate": { + "type": "string", + "enum": [ + "get", + "clear", + "update" + ] + } + } + }, + "request.WebsiteAcmeAccountCreate": { + "type": "object", + "required": [ + "email", + "keyType", + "type" + ], + "properties": { + "eabHmacKey": { + "type": "string" + }, + "eabKid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "keyType": { + "type": "string", + "enum": [ + "P256", + "P384", + "2048", + "3072", + "4096", + "8192" + ] + }, + "type": { + "type": "string", + "enum": [ + "letsencrypt", + "zerossl", + "buypass", + "google" + ] + } + } + }, + "request.WebsiteBatchDelReq": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "request.WebsiteCACreate": { + "type": "object", + "required": [ + "commonName", + "country", + "keyType", + "name", + "organization" + ], + "properties": { + "city": { + "type": "string" + }, + "commonName": { + "type": "string" + }, + "country": { + "type": "string" + }, + "keyType": { + "type": "string", + "enum": [ + "P256", + "P384", + "2048", + "3072", + "4096", + "8192" + ] + }, + "name": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "organizationUint": { + "type": "string" + }, + "province": { + "type": "string" + } + } + }, + "request.WebsiteCAObtain": { + "type": "object", + "required": [ + "domains", + "id", + "keyType", + "time", + "unit" + ], + "properties": { + "autoRenew": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "domains": { + "type": "string" + }, + "execShell": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string", + "enum": [ + "P256", + "P384", + "2048", + "3072", + "4096", + "8192" + ] + }, + "pushDir": { + "type": "boolean" + }, + "renew": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "sslID": { + "type": "integer" + }, + "time": { + "type": "integer" + }, + "unit": { + "type": "string" + } + } + }, + "request.WebsiteCASearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.WebsiteCommonReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteCreate": { + "type": "object", + "required": [ + "alias", + "primaryDomain", + "type", + "webSiteGroupID" + ], + "properties": { + "IPV6": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "appID": { + "type": "integer" + }, + "appInstall": { + "$ref": "#/definitions/request.NewAppInstall" + }, + "appInstallID": { + "type": "integer" + }, + "appType": { + "type": "string", + "enum": [ + "new", + "installed" + ] + }, + "ftpPassword": { + "type": "string" + }, + "ftpUser": { + "type": "string" + }, + "otherDomains": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "runtimeID": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "webSiteGroupID": { + "type": "integer" + } + } + }, + "request.WebsiteDNSReq": { + "type": "object", + "required": [ + "acmeAccountId", + "domains" + ], + "properties": { + "acmeAccountId": { + "type": "integer" + }, + "domains": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "request.WebsiteDefaultUpdate": { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "deleteApp": { + "type": "boolean" + }, + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + } + }, + "request.WebsiteDnsAccountCreate": { + "type": "object", + "required": [ + "authorization", + "name", + "type" + ], + "properties": { + "authorization": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsiteDnsAccountUpdate": { + "type": "object", + "required": [ + "authorization", + "id", + "name", + "type" + ], + "properties": { + "authorization": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsiteDomainCreate": { + "type": "object", + "required": [ + "domains", + "websiteID" + ], + "properties": { + "domains": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.WebsiteDomainDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteHTTPSOp": { + "type": "object", + "required": [ + "websiteId" + ], + "properties": { + "SSLProtocol": { + "type": "array", + "items": { + "type": "string" + } + }, + "algorithm": { + "type": "string" + }, + "certificate": { + "type": "string" + }, + "certificatePath": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "hsts": { + "type": "boolean" + }, + "httpConfig": { + "type": "string", + "enum": [ + "HTTPSOnly", + "HTTPAlso", + "HTTPToHTTPS" + ] + }, + "importType": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPath": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "existed", + "auto", + "manual" + ] + }, + "websiteId": { + "type": "integer" + }, + "websiteSSLId": { + "type": "integer" + } + } + }, + "request.WebsiteHtmlUpdate": { + "type": "object", + "required": [ + "content", + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsiteInstallCheckReq": { + "type": "object", + "properties": { + "InstallIds": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "request.WebsiteLogReq": { + "type": "object", + "required": [ + "id", + "logType", + "operate" + ], + "properties": { + "id": { + "type": "integer" + }, + "logType": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.WebsiteNginxUpdate": { + "type": "object", + "required": [ + "content", + "id" + ], + "properties": { + "content": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "request.WebsiteOp": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "operate": { + "type": "string" + } + } + }, + "request.WebsitePHPConfigUpdate": { + "type": "object", + "required": [ + "id", + "scope" + ], + "properties": { + "disableFunctions": { + "type": "array", + "items": { + "type": "string" + } + }, + "id": { + "type": "integer" + }, + "params": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "scope": { + "type": "string" + }, + "uploadMaxSize": { + "type": "string" + } + } + }, + "request.WebsitePHPFileUpdate": { + "type": "object", + "required": [ + "content", + "id", + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsitePHPVersionReq": { + "type": "object", + "required": [ + "runtimeID", + "websiteID" + ], + "properties": { + "retainConfig": { + "type": "boolean" + }, + "runtimeID": { + "type": "integer" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.WebsiteProxyConfig": { + "type": "object", + "required": [ + "id", + "match", + "name", + "operate", + "proxyHost", + "proxyPass" + ], + "properties": { + "cache": { + "type": "boolean" + }, + "cacheTime": { + "type": "integer" + }, + "cacheUnit": { + "type": "string" + }, + "content": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "filePath": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "match": { + "type": "string" + }, + "modifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "proxyHost": { + "type": "string" + }, + "proxyPass": { + "type": "string" + }, + "replaces": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "sni": { + "type": "boolean" + } + } + }, + "request.WebsiteProxyReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteResourceReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteSSLApply": { + "type": "object", + "required": [ + "ID" + ], + "properties": { + "ID": { + "type": "integer" + }, + "nameservers": { + "type": "array", + "items": { + "type": "string" + } + }, + "skipDNSCheck": { + "type": "boolean" + } + } + }, + "request.WebsiteSSLCreate": { + "type": "object", + "required": [ + "acmeAccountId", + "primaryDomain", + "provider" + ], + "properties": { + "acmeAccountId": { + "type": "integer" + }, + "apply": { + "type": "boolean" + }, + "autoRenew": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "disableCNAME": { + "type": "boolean" + }, + "dnsAccountId": { + "type": "integer" + }, + "execShell": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "nameserver1": { + "type": "string" + }, + "nameserver2": { + "type": "string" + }, + "otherDomains": { + "type": "string" + }, + "primaryDomain": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "pushDir": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "skipDNS": { + "type": "boolean" + } + } + }, + "request.WebsiteSSLSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "acmeAccountID": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.WebsiteSSLUpdate": { + "type": "object", + "required": [ + "id", + "primaryDomain", + "provider" + ], + "properties": { + "acmeAccountId": { + "type": "integer" + }, + "apply": { + "type": "boolean" + }, + "autoRenew": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "disableCNAME": { + "type": "boolean" + }, + "dnsAccountId": { + "type": "integer" + }, + "execShell": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "nameserver1": { + "type": "string" + }, + "nameserver2": { + "type": "string" + }, + "otherDomains": { + "type": "string" + }, + "primaryDomain": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "pushDir": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "skipDNS": { + "type": "boolean" + } + } + }, + "request.WebsiteSSLUpload": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "certificate": { + "type": "string" + }, + "certificatePath": { + "type": "string" + }, + "description": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPath": { + "type": "string" + }, + "sslID": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "paste", + "local" + ] + } + } + }, + "request.WebsiteSearch": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "name": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "primary_domain", + "type", + "status", + "created_at", + "expire_date" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "websiteGroupId": { + "type": "integer" + } + } + }, + "request.WebsiteUpdate": { + "type": "object", + "required": [ + "id", + "primaryDomain" + ], + "properties": { + "IPV6": { + "type": "boolean" + }, + "expireDate": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "webSiteGroupID": { + "type": "integer" + } + } + }, + "request.WebsiteUpdateDir": { + "type": "object", + "required": [ + "id", + "siteDir" + ], + "properties": { + "id": { + "type": "integer" + }, + "siteDir": { + "type": "string" + } + } + }, + "request.WebsiteUpdateDirPermission": { + "type": "object", + "required": [ + "group", + "id", + "user" + ], + "properties": { + "group": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "user": { + "type": "string" + } + } + }, + "response.AppDTO": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "crossVersionUpdate": { + "type": "boolean" + }, + "document": { + "type": "string" + }, + "github": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "installed": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "lastModified": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "readMe": { + "type": "string" + }, + "recommend": { + "type": "integer" + }, + "required": { + "type": "string" + }, + "resource": { + "type": "string" + }, + "shortDescEn": { + "type": "string" + }, + "shortDescZh": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Tag" + } + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "versions": { + "type": "array", + "items": { + "type": "string" + } + }, + "website": { + "type": "string" + } + } + }, + "response.AppDetailDTO": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "createdAt": { + "type": "string" + }, + "dockerCompose": { + "type": "string" + }, + "downloadCallBackUrl": { + "type": "string" + }, + "downloadUrl": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "ignoreUpgrade": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "lastModified": { + "type": "integer" + }, + "lastVersion": { + "type": "string" + }, + "params": {}, + "status": { + "type": "string" + }, + "update": { + "type": "boolean" + }, + "updatedAt": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "response.AppInstalledCheck": { + "type": "object", + "properties": { + "app": { + "type": "string" + }, + "appInstallId": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "httpPort": { + "type": "integer" + }, + "httpsPort": { + "type": "integer" + }, + "installPath": { + "type": "string" + }, + "isExist": { + "type": "boolean" + }, + "lastBackupAt": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "response.AppParam": { + "type": "object", + "properties": { + "edit": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "labelEn": { + "type": "string" + }, + "labelZh": { + "type": "string" + }, + "multiple": { + "type": "boolean" + }, + "required": { + "type": "boolean" + }, + "rule": { + "type": "string" + }, + "showValue": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": {}, + "values": {} + } + }, + "response.AppService": { + "type": "object", + "properties": { + "config": {}, + "from": { + "type": "string" + }, + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "response.FileInfo": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "favoriteID": { + "type": "integer" + }, + "gid": { + "type": "string" + }, + "group": { + "type": "string" + }, + "isDetail": { + "type": "boolean" + }, + "isDir": { + "type": "boolean" + }, + "isHidden": { + "type": "boolean" + }, + "isSymlink": { + "type": "boolean" + }, + "itemTotal": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/files.FileInfo" + } + }, + "linkPath": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "modTime": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "updateTime": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "response.FileTree": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/response.FileTree" + } + }, + "extension": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isDir": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "response.IgnoredApp": { + "type": "object", + "properties": { + "detailID": { + "type": "integer" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "response.NginxParam": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "params": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "response.NginxStatus": { + "type": "object", + "properties": { + "accepts": { + "type": "string" + }, + "active": { + "type": "string" + }, + "handled": { + "type": "string" + }, + "reading": { + "type": "string" + }, + "requests": { + "type": "string" + }, + "waiting": { + "type": "string" + }, + "writing": { + "type": "string" + } + } + }, + "response.PHPConfig": { + "type": "object", + "properties": { + "disableFunctions": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "uploadMaxSize": { + "type": "string" + } + } + }, + "response.PHPExtensionsDTO": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "extensions": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "response.WebsiteAcmeAccountDTO": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "eabHmacKey": { + "type": "string" + }, + "eabKid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "response.WebsiteCADTO": { + "type": "object", + "properties": { + "city": { + "type": "string" + }, + "commonName": { + "type": "string" + }, + "country": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "csr": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "name": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "organizationUint": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "province": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "response.WebsiteDNSRes": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "err": { + "type": "string" + }, + "resolve": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "response.WebsiteDTO": { + "type": "object", + "properties": { + "IPV6": { + "type": "boolean" + }, + "accessLog": { + "type": "boolean" + }, + "accessLogPath": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "appInstallId": { + "type": "integer" + }, + "appName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "defaultServer": { + "type": "boolean" + }, + "domains": { + "type": "array", + "items": { + "$ref": "#/definitions/model.WebsiteDomain" + } + }, + "errorLog": { + "type": "boolean" + }, + "errorLogPath": { + "type": "string" + }, + "expireDate": { + "type": "string" + }, + "ftpId": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "httpConfig": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "rewrite": { + "type": "string" + }, + "runtimeID": { + "type": "integer" + }, + "runtimeName": { + "type": "string" + }, + "siteDir": { + "type": "string" + }, + "sitePath": { + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "user": { + "type": "string" + }, + "webSiteGroupId": { + "type": "integer" + }, + "webSiteSSL": { + "$ref": "#/definitions/model.WebsiteSSL" + }, + "webSiteSSLId": { + "type": "integer" + } + } + }, + "response.WebsiteHTTPS": { + "type": "object", + "properties": { + "SSL": { + "$ref": "#/definitions/model.WebsiteSSL" + }, + "SSLProtocol": { + "type": "array", + "items": { + "type": "string" + } + }, + "algorithm": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "hsts": { + "type": "boolean" + }, + "httpConfig": { + "type": "string" + } + } + }, + "response.WebsiteLog": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "end": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "response.WebsiteNginxConfig": { + "type": "object", + "properties": { + "enable": { + "type": "boolean" + }, + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/response.NginxParam" + } + } + } + }, + "response.WebsitePreInstallCheck": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "localhost", + BasePath: "/api/v1", + Schemes: []string{}, + Title: "1Panel", + Description: "开源Linux面板", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/core/cmd/server/docs/swagger.go b/core/cmd/server/docs/swagger.go new file mode 100644 index 000000000..b0022e43c --- /dev/null +++ b/core/cmd/server/docs/swagger.go @@ -0,0 +1,6 @@ +package docs + +import _ "embed" + +//go:embed swagger.json +var SwaggerJson []byte diff --git a/core/cmd/server/docs/swagger.json b/core/cmd/server/docs/swagger.json new file mode 100644 index 000000000..de2b02277 --- /dev/null +++ b/core/cmd/server/docs/swagger.json @@ -0,0 +1,23441 @@ +{ + "swagger": "2.0", + "info": { + "description": "开源Linux面板", + "title": "1Panel", + "termsOfService": "http://swagger.io/terms/", + "contact": {}, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0" + }, + "host": "localhost", + "basePath": "/api/v1", + "paths": { + "/apps/:key": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 key 获取应用信息", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app by key", + "parameters": [ + { + "type": "string", + "description": "app key", + "name": "key", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppDTO" + } + } + } + } + }, + "/apps/checkupdate": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用更新版本", + "tags": [ + "App" + ], + "summary": "Get app list update", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/apps/detail/:appId/:version/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 appid 获取应用详情", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app detail by appid", + "parameters": [ + { + "type": "integer", + "description": "app id", + "name": "appId", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "app 版本", + "name": "version", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "app 类型", + "name": "version", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppDetailDTO" + } + } + } + } + }, + "/apps/details/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 获取应用详情", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Get app detail by id", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "appId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppDetailDTO" + } + } + } + } + }, + "/apps/ignored": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取忽略的应用版本", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Get Ignore App", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.IgnoredApp" + } + } + } + } + }, + "/apps/install": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "安装应用", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Install app", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstallCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/model.AppInstall" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "app_installs", + "input_column": "name", + "input_value": "name", + "isList": false, + "output_column": "app_id", + "output_value": "appId" + }, + { + "db": "apps", + "info": "appId", + "isList": false, + "output_column": "key", + "output_value": "appKey" + } + ], + "bodyKeys": [ + "name" + ], + "formatEN": "Install app [appKey]-[name]", + "formatZH": "安装应用 [appKey]-[name]", + "paramKeys": [] + } + } + }, + "/apps/installed/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检查应用安装情况", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Check app installed", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppInstalledCheck" + } + } + } + } + }, + "/apps/installed/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 key 获取应用默认配置", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search default config by key", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/apps/installed/conninfo/:key": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用连接信息", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app password by key", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/apps/installed/delete/check/:appInstallId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Check before delete", + "parameters": [ + { + "type": "integer", + "description": "App install id", + "name": "appInstallId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AppResource" + } + } + } + } + } + }, + "/apps/installed/ignore": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "忽略应用升级版本", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "ignore App Update", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledIgnoreUpgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "installId" + ], + "formatEN": "Application param update [installId]", + "formatZH": "忽略应用 [installId] 版本升级", + "paramKeys": [] + } + } + }, + "/apps/installed/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取已安装应用列表", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "List app installed", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AppInstallInfo" + } + } + } + } + } + }, + "/apps/installed/loadport": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用端口", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app port by key", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "integer" + } + } + } + } + }, + "/apps/installed/op": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作已安装应用", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Operate installed app", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "app_installs", + "input_column": "id", + "input_value": "installId", + "isList": false, + "output_column": "app_id", + "output_value": "appId" + }, + { + "db": "app_installs", + "input_column": "id", + "input_value": "installId", + "isList": false, + "output_column": "name", + "output_value": "appName" + }, + { + "db": "apps", + "input_column": "id", + "input_value": "appId", + "isList": false, + "output_column": "key", + "output_value": "appKey" + } + ], + "bodyKeys": [ + "installId", + "operate" + ], + "formatEN": "[operate] App [appKey][appName]", + "formatZH": "[operate] 应用 [appKey][appName]", + "paramKeys": [] + } + } + }, + "/apps/installed/params/:appInstallId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 install id 获取应用参数", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search params by appInstallId", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "appInstallId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.AppParam" + } + } + } + } + }, + "/apps/installed/params/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改应用参数", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Change app params", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "installId" + ], + "formatEN": "Application param update [installId]", + "formatZH": "应用参数修改 [installId]", + "paramKeys": [] + } + } + }, + "/apps/installed/port/change": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改应用端口", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Change app port", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PortUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "name", + "port" + ], + "formatEN": "Application port update [key]-[name] =\u003e [port]", + "formatZH": "应用端口修改 [key]-[name] =\u003e [port]", + "paramKeys": [] + } + } + }, + "/apps/installed/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分页获取已安装应用列表", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Page app installed", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppInstalledSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/apps/installed/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步已安装应用列表", + "tags": [ + "App" + ], + "summary": "Sync app installed", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Sync the list of installed apps", + "formatZH": "同步已安装应用列表", + "paramKeys": [] + } + } + }, + "/apps/installed/update/versions": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 install id 获取应用更新版本", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app update version by install id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "appInstallId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AppVersion" + } + } + } + } + } + }, + "/apps/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取应用列表", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "List apps", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AppSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/apps/services/:key": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 key 获取应用 service", + "consumes": [ + "application/json" + ], + "tags": [ + "App" + ], + "summary": "Search app service by key", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "key", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.AppService" + } + } + } + } + } + }, + "/apps/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步应用列表", + "tags": [ + "App" + ], + "summary": "Sync app list", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "App store synchronization", + "formatZH": "应用商店同步", + "paramKeys": [] + } + } + }, + "/auth/captcha": { + "get": { + "description": "加载验证码", + "tags": [ + "Auth" + ], + "summary": "Load captcha", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CaptchaResponse" + } + } + } + } + }, + "/auth/demo": { + "get": { + "description": "判断是否为demo环境", + "tags": [ + "Auth" + ], + "summary": "Check System isDemo", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/issafety": { + "get": { + "description": "获取系统安全登录状态", + "tags": [ + "Auth" + ], + "summary": "Load safety status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/language": { + "get": { + "description": "获取系统语言设置", + "tags": [ + "Auth" + ], + "summary": "Load System Language", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/login": { + "post": { + "description": "用户登录", + "consumes": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "User login", + "parameters": [ + { + "type": "string", + "description": "安全入口 base64 加密串", + "name": "EntranceCode", + "in": "header", + "required": true + }, + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Login" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.UserLoginInfo" + } + } + } + } + }, + "/auth/logout": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "用户登出", + "tags": [ + "Auth" + ], + "summary": "User logout", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/auth/mfalogin": { + "post": { + "description": "用户 mfa 登录", + "consumes": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "User login with mfa", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MFALogin" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.UserLoginInfo" + }, + "headers": { + "EntranceCode": { + "type": "string", + "description": "安全入口" + } + } + } + } + } + }, + "/containers": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Create container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "image" + ], + "formatEN": "create container [name][image]", + "formatZH": "创建容器 [name][image]", + "paramKeys": [] + } + } + }, + "/containers/clean/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清理容器日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Clean container log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "clean container [name] logs", + "formatZH": "清理容器 [name] 日志", + "paramKeys": [] + } + } + }, + "/containers/commit": { + "post": { + "description": "容器提交生成新镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Commit Container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerCommit" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/compose": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器编排", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Create compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create compose [name]", + "formatZH": "创建 compose [name]", + "paramKeys": [] + } + } + }, + "/containers/compose/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器编排操作", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Operate compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeOperation" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "operation" + ], + "formatEN": "compose [operation] [name]", + "formatZH": "compose [operation] [name]", + "paramKeys": [] + } + } + }, + "/containers/compose/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取编排列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Page composes", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/compose/search/log": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "docker-compose 日志", + "tags": [ + "Container Compose" + ], + "summary": "Container Compose logs", + "parameters": [ + { + "type": "string", + "description": "compose 文件地址", + "name": "compose", + "in": "query" + }, + { + "type": "string", + "description": "时间筛选", + "name": "since", + "in": "query" + }, + { + "type": "string", + "description": "是否追踪", + "name": "follow", + "in": "query" + }, + { + "type": "string", + "description": "显示行号", + "name": "tail", + "in": "query" + } + ], + "responses": {} + } + }, + "/containers/compose/test": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "测试 compose 是否可用", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Test compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "check compose [name]", + "formatZH": "检测 compose [name] 格式", + "paramKeys": [] + } + } + }, + "/containers/compose/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器编排", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose" + ], + "summary": "Update compose", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "update compose information [name]", + "formatZH": "更新 compose [name]", + "paramKeys": [] + } + } + }, + "/containers/daemonjson": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 配置信息", + "produces": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Load docker daemon.json", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DaemonJsonConf" + } + } + } + } + }, + "/containers/daemonjson/file": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 配置信息(表单)", + "produces": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Load docker daemon.json", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/containers/daemonjson/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 docker 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "Updated configuration [key]", + "formatZH": "更新配置 [key]", + "paramKeys": [] + } + } + }, + "/containers/daemonjson/update/byfile": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传替换 docker 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json by upload file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DaemonJsonUpdateByFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Updated configuration file", + "formatZH": "更新配置文件", + "paramKeys": [] + } + } + }, + "/containers/docker/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Docker 操作", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Operate docker", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DockerOperation" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] docker service", + "formatZH": "docker 服务 [operation]", + "paramKeys": [] + } + } + }, + "/containers/docker/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 服务状态", + "produces": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Load docker status", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/containers/download/log": { + "post": { + "description": "下载容器日志", + "responses": {} + } + }, + "/containers/image": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像名称列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "load images options", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Options" + } + } + } + } + } + }, + "/containers/image/all": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取所有镜像列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "List all images", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ImageInfo" + } + } + } + } + } + }, + "/containers/image/build": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "构建镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Build image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageBuild" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "build image [name]", + "formatZH": "构建镜像 [name]", + "paramKeys": [] + } + } + }, + "/containers/image/load": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "导入镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Load image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageLoad" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "load image from [path]", + "formatZH": "从 [path] 加载镜像", + "paramKeys": [] + } + } + }, + "/containers/image/pull": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "拉取镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Pull image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImagePull" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "repoID", + "isList": false, + "output_column": "name", + "output_value": "reponame" + } + ], + "bodyKeys": [ + "repoID", + "imageName" + ], + "formatEN": "image pull [reponame][imageName]", + "formatZH": "镜像拉取 [reponame][imageName]", + "paramKeys": [] + } + } + }, + "/containers/image/push": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "推送镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Push image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImagePush" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "repoID", + "isList": false, + "output_column": "name", + "output_value": "reponame" + } + ], + "bodyKeys": [ + "repoID", + "tagName", + "name" + ], + "formatEN": "push [tagName] to [reponame][name]", + "formatZH": "[tagName] 推送到 [reponame][name]", + "paramKeys": [] + } + } + }, + "/containers/image/remove": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Delete image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names" + ], + "formatEN": "remove image [names]", + "formatZH": "移除镜像 [names]", + "paramKeys": [] + } + } + }, + "/containers/image/save": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "导出镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Save image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageSave" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "tagName", + "path", + "name" + ], + "formatEN": "save [tagName] as [path]/[name]", + "formatZH": "保留 [tagName] 为 [path]/[name]", + "paramKeys": [] + } + } + }, + "/containers/image/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Page images", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/image/tag": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Tag 镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Image" + ], + "summary": "Tag image", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageTag" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "repoID", + "isList": false, + "output_column": "name", + "output_value": "reponame" + } + ], + "bodyKeys": [ + "repoID", + "targetName" + ], + "formatEN": "tag image [reponame][targetName]", + "formatZH": "tag 镜像 [reponame][targetName]", + "paramKeys": [] + } + } + }, + "/containers/info": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器表单信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Load container info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ContainerOperate" + } + } + } + } + }, + "/containers/inspect": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器详情", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Container inspect", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.InspectReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/containers/ipv6option/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 docker ipv6 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json ipv6 option", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.LogOption" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Updated the ipv6 option", + "formatZH": "更新 ipv6 配置", + "paramKeys": [] + } + } + }, + "/containers/limit": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器限制", + "summary": "Load container limits", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ResourceLimit" + } + } + } + } + }, + "/containers/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器名称", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "List containers", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/list/stats": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器列表资源占用", + "summary": "Load container stats", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ContainerListStats" + } + } + } + } + } + }, + "/containers/load/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器操作日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Load container log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/logoption/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 docker 日志配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Docker" + ], + "summary": "Update docker daemon.json log option", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.LogOption" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Updated the log option", + "formatZH": "更新日志配置", + "paramKeys": [] + } + } + }, + "/containers/network": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器网络列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "List networks", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Options" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器网络", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "Create network", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.NetworkCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create container network [name]", + "formatZH": "创建容器网络 name", + "paramKeys": [] + } + } + }, + "/containers/network/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除容器网络", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "Delete network", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names" + ], + "formatEN": "delete container network [names]", + "formatZH": "删除容器网络 [names]", + "paramKeys": [] + } + } + }, + "/containers/network/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器网络列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Network" + ], + "summary": "Page networks", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器操作", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Operate Container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerOperation" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names", + "operation" + ], + "formatEN": "container [operation] [names]", + "formatZH": "容器 [names] 执行 [operation]", + "paramKeys": [] + } + } + }, + "/containers/prune": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器清理", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Clean container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerPrune" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ContainerPruneReport" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "pruneType" + ], + "formatEN": "clean container [pruneType]", + "formatZH": "清理容器 [pruneType]", + "paramKeys": [] + } + } + }, + "/containers/rename": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器重命名", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Rename Container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerRename" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "newName" + ], + "formatEN": "rename container [name] =\u003e [newName]", + "formatZH": "容器重命名 [name] =\u003e [newName]", + "paramKeys": [] + } + } + }, + "/containers/repo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像仓库列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "List image repos", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ImageRepoOption" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建镜像仓库", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Create image repo", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageRepoDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create image repo [name]", + "formatZH": "创建镜像仓库 [name]", + "paramKeys": [] + } + } + }, + "/containers/repo/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除镜像仓库", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Delete image repo", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageRepoDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete image repo [names]", + "formatZH": "删除镜像仓库 [names]", + "paramKeys": [] + } + } + }, + "/containers/repo/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取镜像仓库列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Page image repos", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/repo/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 docker 仓库状态", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Load repo status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/containers/repo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新镜像仓库", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Image-repo" + ], + "summary": "Update image repo", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ImageRepoUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "image_repos", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "update image repo information [name]", + "formatZH": "更新镜像仓库 [name]", + "paramKeys": [] + } + } + }, + "/containers/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Page containers", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageContainer" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/search/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器日志", + "tags": [ + "Container" + ], + "summary": "Container logs", + "parameters": [ + { + "type": "string", + "description": "容器名称", + "name": "container", + "in": "query" + }, + { + "type": "string", + "description": "时间筛选", + "name": "since", + "in": "query" + }, + { + "type": "string", + "description": "是否追踪", + "name": "follow", + "in": "query" + }, + { + "type": "string", + "description": "显示行号", + "name": "tail", + "in": "query" + } + ], + "responses": {} + } + }, + "/containers/stats/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "容器监控信息", + "tags": [ + "Container" + ], + "summary": "Container stats", + "parameters": [ + { + "type": "integer", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ContainerStats" + } + } + } + } + }, + "/containers/template": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器编排模版列表", + "produces": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "List compose templates", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ComposeTemplateInfo" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器编排模版", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Create compose template", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeTemplateCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create compose template [name]", + "formatZH": "创建 compose 模版 [name]", + "paramKeys": [] + } + } + }, + "/containers/template/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除容器编排模版", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Delete compose template", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "compose_templates", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete compose template [names]", + "formatZH": "删除 compose 模版 [names]", + "paramKeys": [] + } + } + }, + "/containers/template/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器编排模版列表分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Page compose templates", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/containers/template/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器编排模版", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Compose-template" + ], + "summary": "Update compose template", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ComposeTemplateUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "compose_templates", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "update compose template information [name]", + "formatZH": "更新 compose 模版 [name]", + "paramKeys": [] + } + } + }, + "/containers/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Update container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "image" + ], + "formatEN": "update container [name][image]", + "formatZH": "更新容器 [name][image]", + "paramKeys": [] + } + } + }, + "/containers/upgrade": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新容器镜像", + "consumes": [ + "application/json" + ], + "tags": [ + "Container" + ], + "summary": "Upgrade container", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ContainerUpgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "image" + ], + "formatEN": "upgrade container image [name][image]", + "formatZH": "更新容器镜像 [name][image]", + "paramKeys": [] + } + } + }, + "/containers/volume": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器存储卷列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "List volumes", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Options" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建容器存储卷", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "Create volume", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.VolumeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create container volume [name]", + "formatZH": "创建容器存储卷 [name]", + "paramKeys": [] + } + } + }, + "/containers/volume/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除容器存储卷", + "consumes": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "Delete volume", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "names" + ], + "formatEN": "delete container volume [names]", + "formatZH": "删除容器存储卷 [names]", + "paramKeys": [] + } + } + }, + "/containers/volume/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取容器存储卷分页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Container Volume" + ], + "summary": "Page volumes", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/cronjobs": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Create cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name" + ], + "formatEN": "create cronjob [type][name]", + "formatZH": "创建计划任务 [type][name]", + "paramKeys": [] + } + } + }, + "/cronjobs/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Delete cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobBatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete cronjob [names]", + "formatZH": "删除计划任务 [names]", + "paramKeys": [] + } + } + }, + "/cronjobs/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载计划任务记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Download cronjob records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobDownload" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "job_records", + "input_column": "id", + "input_value": "recordID", + "isList": false, + "output_column": "file", + "output_value": "file" + } + ], + "bodyKeys": [ + "recordID" + ], + "formatEN": "download the cronjob record [file]", + "formatZH": "下载计划任务记录 [file]", + "paramKeys": [] + } + } + }, + "/cronjobs/handle": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "手动执行计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Handle cronjob once", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "manually execute the cronjob [name]", + "formatZH": "手动执行计划任务 [name]", + "paramKeys": [] + } + } + }, + "/cronjobs/records/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空计划任务记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Clean job records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobClean" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "clean cronjob [name] records", + "formatZH": "清空计划任务记录 [name]", + "paramKeys": [] + } + } + }, + "/cronjobs/records/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取计划任务记录日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Load Cronjob record log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/cronjobs/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取计划任务分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Page cronjobs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageCronjob" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/cronjobs/search/records": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取计划任务记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Page job records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchRecord" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/cronjobs/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新计划任务状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Update cronjob status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobUpdateStatus" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "status" + ], + "formatEN": "change the status of cronjob [name] to [status].", + "formatZH": "修改计划任务 [name] 状态为 [status]", + "paramKeys": [] + } + } + }, + "/cronjobs/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新计划任务", + "consumes": [ + "application/json" + ], + "tags": [ + "Cronjob" + ], + "summary": "Update cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CronjobUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "cronjobs", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "update cronjob [name]", + "formatZH": "更新计划任务 [name]", + "paramKeys": [] + } + } + }, + "/dashboard/base/:ioOption/:netOption": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取首页基础数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "Load dashboard base info", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "ioOption", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "request", + "name": "netOption", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DashboardBase" + } + } + } + } + }, + "/dashboard/base/os": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取服务器基础数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "Load os info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.OsInfo" + } + } + } + } + }, + "/dashboard/current/:ioOption/:netOption": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取首页实时数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "Load dashboard current info", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "ioOption", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "request", + "name": "netOption", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DashboardCurrent" + } + } + } + } + }, + "/dashboard/system/restart/:operation": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "重启服务器/面板", + "consumes": [ + "application/json" + ], + "tags": [ + "Dashboard" + ], + "summary": "System restart", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "operation", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/databases": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建 mysql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Create mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create mysql database [name]", + "formatZH": "创建 mysql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/bind": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "绑定 mysql 数据库用户", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Bind user of mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BindUser" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "database", + "username" + ], + "formatEN": "bind mysql database [database] [username]", + "formatZH": "绑定 mysql 数据库名 [database] [username]", + "paramKeys": [] + } + } + }, + "/databases/change/access": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 mysql 访问权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Change mysql access", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update database [name] access", + "formatZH": "更新数据库 [name] 访问权限", + "paramKeys": [] + } + } + }, + "/databases/change/password": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 mysql 密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Change mysql password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update database [name] password", + "formatZH": "更新数据库 [name] 密码", + "paramKeys": [] + } + } + }, + "/databases/common/info": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取数据库基础信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Common" + ], + "summary": "Load base info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DBBaseInfo" + } + } + } + } + }, + "/databases/common/load/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取数据库配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Common" + ], + "summary": "Load Database conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/databases/common/update/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传替换配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Common" + ], + "summary": "Update conf by upload file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DBConfUpdateByFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "database" + ], + "formatEN": "update the [type] [database] database configuration information", + "formatZH": "更新 [type] 数据库 [database] 配置信息", + "paramKeys": [] + } + } + }, + "/databases/db": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建远程数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Create database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "create database [name][type]", + "formatZH": "创建远程数据库 [name][type]", + "paramKeys": [] + } + } + }, + "/databases/db/:name": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取远程数据库", + "tags": [ + "Database" + ], + "summary": "Get databases", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DatabaseInfo" + } + } + } + } + }, + "/databases/db/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检测远程数据库连接性", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Check database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "check if database [name][type] is connectable", + "formatZH": "检测远程数据库 [name][type] 连接性", + "paramKeys": [] + } + } + }, + "/databases/db/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除远程数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Delete database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "databases", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete database [names]", + "formatZH": "删除远程数据库 [names]", + "paramKeys": [] + } + } + }, + "/databases/db/item/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取数据库列表", + "tags": [ + "Database" + ], + "summary": "List databases", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.DatabaseItem" + } + } + } + } + } + }, + "/databases/db/list/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取远程数据库列表", + "tags": [ + "Database" + ], + "summary": "List databases", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.DatabaseOption" + } + } + } + } + } + }, + "/databases/db/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取远程数据库列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Page databases", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/databases/db/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新远程数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Update database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DatabaseUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "update database [name]", + "formatZH": "更新远程数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 mysql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Delete mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete mysql database [name]", + "formatZH": "删除 mysql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/del/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mysql 数据库删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Check before delete mysql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBDeleteCheck" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/databases/description/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 mysql 数据库库描述信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Update mysql database description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_mysqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "description" + ], + "formatEN": "The description of the mysql database [name] is modified =\u003e [description]", + "formatZH": "mysql 数据库 [name] 描述信息修改 [description]", + "paramKeys": [] + } + } + }, + "/databases/load": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从服务器获取", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql database from remote", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlLoadDB" + } + } + ], + "responses": {} + } + }, + "/databases/options": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 数据库列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "List mysql database names", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MysqlOption" + } + } + } + } + } + }, + "/databases/pg": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建 postgresql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Create postgresql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "create postgresql database [name]", + "formatZH": "创建 postgresql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/pg/:database/load": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从服务器获取", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Load postgresql database from remote", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlLoadDB" + } + } + ], + "responses": {} + } + }, + "/databases/pg/bind": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "绑定 postgresql 数据库用户", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Bind postgresql user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlBindUser" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "username" + ], + "formatEN": "bind postgresql database [name] user [username]", + "formatZH": "绑定 postgresql 数据库 [name] 用户 [username]", + "paramKeys": [] + } + } + }, + "/databases/pg/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 postgresql 数据库", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Delete postgresql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_postgresqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete postgresql database [name]", + "formatZH": "删除 postgresql 数据库 [name]", + "paramKeys": [] + } + } + }, + "/databases/pg/del/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Postgresql 数据库删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Check before delete postgresql database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBDeleteCheck" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/databases/pg/description": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 postgresql 数据库库描述信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Update postgresql database description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_postgresqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "description" + ], + "formatEN": "The description of the postgresql database [name] is modified =\u003e [description]", + "formatZH": "postgresql 数据库 [name] 描述信息修改 [description]", + "paramKeys": [] + } + } + }, + "/databases/pg/password": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 postgresql 密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Change postgresql password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "database_postgresqls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update database [name] password", + "formatZH": "更新数据库 [name] 密码", + "paramKeys": [] + } + } + }, + "/databases/pg/privileges": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 postgresql 用户权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Change postgresql privileges", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeDBInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "database", + "username" + ], + "formatEN": "Update [user] privileges of database [database]", + "formatZH": "更新数据库 [database] 用户 [username] 权限", + "paramKeys": [] + } + } + }, + "/databases/pg/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 postgresql 数据库列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Postgresql" + ], + "summary": "Page postgresql databases", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PostgresqlDBSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/databases/redis/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Load redis conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.RedisConf" + } + } + } + } + }, + "/databases/redis/conf/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 redis 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Update redis conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RedisConfUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "update the redis database configuration information", + "formatZH": "更新 redis 数据库配置信息", + "paramKeys": [] + } + } + }, + "/databases/redis/install/cli": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "安装 redis cli", + "tags": [ + "Database Redis" + ], + "summary": "Install redis-cli", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/databases/redis/password": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 redis 密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Change redis password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeRedisPass" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "change the password of the redis database", + "formatZH": "修改 redis 数据库密码", + "paramKeys": [] + } + } + }, + "/databases/redis/persistence/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 持久化配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Load redis persistence conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.RedisPersistence" + } + } + } + } + }, + "/databases/redis/persistence/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 redis 持久化配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Update redis persistence conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RedisConfPersistenceUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "redis database persistence configuration update", + "formatZH": "redis 数据库持久化配置更新", + "paramKeys": [] + } + } + }, + "/databases/redis/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 状态信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Redis" + ], + "summary": "Load redis status info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.RedisStatus" + } + } + } + } + }, + "/databases/remote": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 远程访问权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql remote access", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "boolean" + } + } + } + } + }, + "/databases/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 数据库列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Page mysql databases", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlDBSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/databases/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 状态信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql status info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.MysqlStatus" + } + } + } + } + }, + "/databases/variables": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mysql 性能参数信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Load mysql variables info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithNameAndType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.MysqlVariables" + } + } + } + } + }, + "/databases/variables/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "mysql 性能调优", + "consumes": [ + "application/json" + ], + "tags": [ + "Database Mysql" + ], + "summary": "Update mysql variables", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MysqlVariablesUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "adjust mysql database performance parameters", + "formatZH": "调整 mysql 数据库性能参数", + "paramKeys": [] + } + } + }, + "/db/remote/del/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mysql 远程数据库删除前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Database" + ], + "summary": "Check before delete remote database", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/files": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建文件/文件夹", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Create file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Create dir or file [path]", + "formatZH": "创建文件/文件夹 [path]", + "paramKeys": [] + } + } + }, + "/files/batch/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "批量删除文件/文件夹", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Batch delete file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileBatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "paths" + ], + "formatEN": "Batch delete dir or file [paths]", + "formatZH": "批量删除文件/文件夹 [paths]", + "paramKeys": [] + } + } + }, + "/files/batch/role": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "批量修改文件权限和用户/组", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Batch change file mode and owner", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileRoleReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "paths", + "mode", + "user", + "group" + ], + "formatEN": "Batch change file mode and owner [paths] =\u003e [mode]/[user]/[group]", + "formatZH": "批量修改文件权限和用户/组 [paths] =\u003e [mode]/[user]/[group]", + "paramKeys": [] + } + } + }, + "/files/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检测文件是否存在", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Check file exist", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FilePathCheck" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/chunkdownload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分片下载下载文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Chunk Download file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileDownload" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Download file [name]", + "formatZH": "下载文件 [name]", + "paramKeys": [] + } + } + }, + "/files/chunkupload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分片上传文件", + "tags": [ + "File" + ], + "summary": "ChunkUpload file", + "parameters": [ + { + "type": "file", + "description": "request", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/compress": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "压缩文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Compress file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileCompress" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Compress file [name]", + "formatZH": "压缩文件 [name]", + "paramKeys": [] + } + } + }, + "/files/content": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取文件内容", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Load file content", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileContentReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Load file content [path]", + "formatZH": "获取文件内容 [path]", + "paramKeys": [] + } + } + }, + "/files/decompress": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "解压文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Decompress file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileDeCompress" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Decompress file [path]", + "formatZH": "解压 [path]", + "paramKeys": [] + } + } + }, + "/files/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除文件/文件夹", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Delete file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Delete dir or file [path]", + "formatZH": "删除文件/文件夹 [path]", + "paramKeys": [] + } + } + }, + "/files/download": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Download file", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/favorite": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建收藏", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Create favorite", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FavoriteCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "收藏文件/文件夹 [path]", + "formatZH": "收藏文件/文件夹 [path]", + "paramKeys": [] + } + } + }, + "/files/favorite/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除收藏", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Delete favorite", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FavoriteDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "favorites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "path", + "output_value": "path" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete avorite [path]", + "formatZH": "删除收藏 [path]", + "paramKeys": [] + } + } + }, + "/files/favorite/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取收藏列表", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "List favorites", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/mode": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改文件权限", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Change file mode", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path", + "mode" + ], + "formatEN": "Change mode [paths] =\u003e [mode]", + "formatZH": "修改权限 [paths] =\u003e [mode]", + "paramKeys": [] + } + } + }, + "/files/move": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "移动文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Move file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileMove" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "oldPaths", + "newPath" + ], + "formatEN": "Move [oldPaths] =\u003e [newPath]", + "formatZH": "移动文件 [oldPaths] =\u003e [newPath]", + "paramKeys": [] + } + } + }, + "/files/owner": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改文件用户/组", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Change file owner", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileRoleUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path", + "user", + "group" + ], + "formatEN": "Change owner [paths] =\u003e [user]/[group]", + "formatZH": "修改用户/组 [paths] =\u003e [user]/[group]", + "paramKeys": [] + } + } + }, + "/files/read": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "按行读取日志文件", + "tags": [ + "File" + ], + "summary": "Read file by Line", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileReadByLineReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/recycle/clear": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空回收站文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Clear RecycleBin files", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "清空回收站", + "formatZH": "清空回收站", + "paramKeys": [] + } + } + }, + "/files/recycle/reduce": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "还原回收站文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Reduce RecycleBin files", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RecycleBinReduce" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Reduce RecycleBin file [name]", + "formatZH": "还原回收站文件 [name]", + "paramKeys": [] + } + } + }, + "/files/recycle/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取回收站文件列表", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "List RecycleBin files", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/recycle/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取回收站状态", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Get RecycleBin status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/files/rename": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改文件名称", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Change file name", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileRename" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "oldName", + "newName" + ], + "formatEN": "Rename [oldName] =\u003e [newName]", + "formatZH": "重命名 [oldName] =\u003e [newName]", + "paramKeys": [] + } + } + }, + "/files/save": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新文件内容", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Update file content", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileEdit" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Update file content [path]", + "formatZH": "更新文件内容 [path]", + "paramKeys": [] + } + } + }, + "/files/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取文件列表", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "List files", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileOption" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/files/size": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取文件夹大小", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Load file size", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.DirSizeReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Load file size [path]", + "formatZH": "获取文件夹大小 [path]", + "paramKeys": [] + } + } + }, + "/files/tree": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载文件树", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Load files tree", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileOption" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.FileTree" + } + } + } + } + } + }, + "/files/upload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传文件", + "tags": [ + "File" + ], + "summary": "Upload file", + "parameters": [ + { + "type": "file", + "description": "request", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "path" + ], + "formatEN": "Upload file [path]", + "formatZH": "上传文件 [path]", + "paramKeys": [] + } + } + }, + "/files/upload/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分页获取上传文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Page file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.SearchUploadWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + } + }, + "/files/wget": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载远端文件", + "consumes": [ + "application/json" + ], + "tags": [ + "File" + ], + "summary": "Wget file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.FileWget" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "url", + "path", + "name" + ], + "formatEN": "Download url =\u003e [path]/[name]", + "formatZH": "下载 url =\u003e [path]/[name]", + "paramKeys": [] + } + } + }, + "/groups": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GroupCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "create group [name][type]", + "formatZH": "创建组 [name][type]", + "paramKeys": [] + } + } + }, + "/groups/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "Delete group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "groups", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + }, + { + "db": "groups", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "type", + "output_value": "type" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete group [type][name]", + "formatZH": "删除组 [type][name]", + "paramKeys": [] + } + } + }, + "/groups/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "查询系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "List groups", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GroupSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.GroupInfo" + } + } + } + } + } + }, + "/groups/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统组", + "consumes": [ + "application/json" + ], + "tags": [ + "System Group" + ], + "summary": "Update group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GroupUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "type" + ], + "formatEN": "update group [name][type]", + "formatZH": "更新组 [name][type]", + "paramKeys": [] + } + } + }, + "/host/conffile/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传文件更新 SSH 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Update host SSH setting by file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SSHConf" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "update SSH conf", + "formatZH": "修改 SSH 配置文件", + "paramKeys": [] + } + } + }, + "/host/ssh/conf": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 SSH 配置文件", + "tags": [ + "SSH" + ], + "summary": "Load host SSH conf", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/ssh/generate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "生成 SSH 密钥", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Generate host SSH secret", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GenerateSSH" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "generate SSH secret", + "formatZH": "生成 SSH 密钥 ", + "paramKeys": [] + } + } + }, + "/host/ssh/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 SSH 登录日志", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Load host SSH logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchSSHLog" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SSHLog" + } + } + } + } + }, + "/host/ssh/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 SSH 服务状态", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Operate SSH", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] SSH", + "formatZH": "[operation] SSH ", + "paramKeys": [] + } + } + }, + "/host/ssh/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载 SSH 配置信息", + "tags": [ + "SSH" + ], + "summary": "Load host SSH setting info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SSHInfo" + } + } + } + } + }, + "/host/ssh/secret": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 SSH 密钥", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Load host SSH secret", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.GenerateLoad" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/ssh/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 SSH 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "SSH" + ], + "summary": "Update host SSH setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SSHUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update SSH setting [key] =\u003e [value]", + "formatZH": "修改 SSH 配置 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/host/tool": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取主机工具状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get tool", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/tool/config": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作主机工具配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get tool config", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolConfig" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate" + ], + "formatEN": "[operate] tool config", + "formatZH": "[operate] 主机工具配置文件 ", + "paramKeys": [] + } + } + }, + "/host/tool/create": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建主机工具配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Create Host tool Config", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "create [type] config", + "formatZH": "创建 [type] 配置", + "paramKeys": [] + } + } + }, + "/host/tool/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取主机工具日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get tool", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolLogReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/host/tool/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作主机工具", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Operate tool", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.HostToolReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate", + "type" + ], + "formatEN": "[operate] [type]", + "formatZH": "[operate] [type] ", + "paramKeys": [] + } + } + }, + "/host/tool/supervisor/process": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Supervisor 进程配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get Supervisor process config", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作守护进程", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Create Supervisor process", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.SupervisorProcessConfig" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate" + ], + "formatEN": "[operate] process", + "formatZH": "[operate] 守护进程 ", + "paramKeys": [] + } + } + }, + "/host/tool/supervisor/process/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作 Supervisor 进程文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Host tool" + ], + "summary": "Get Supervisor process config", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.SupervisorProcessFileReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate" + ], + "formatEN": "[operate] Supervisor Process Config file", + "formatZH": "[operate] Supervisor 进程文件 ", + "paramKeys": [] + } + } + }, + "/hosts": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建主机", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Create host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.HostOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "addr" + ], + "formatEN": "create host [name][addr]", + "formatZH": "创建主机 [name][addr]", + "paramKeys": [] + } + } + }, + "/hosts/command": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快速命令列表", + "tags": [ + "Command" + ], + "summary": "List commands", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CommandInfo" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Create command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommandOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "command" + ], + "formatEN": "create quick command [name][command]", + "formatZH": "创建快捷命令 [name][command]", + "paramKeys": [] + } + } + }, + "/hosts/command/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Delete command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "commands", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete quick command [names]", + "formatZH": "删除快捷命令 [names]", + "paramKeys": [] + } + } + }, + "/hosts/command/redis": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 快速命令列表", + "tags": [ + "Redis Command" + ], + "summary": "List redis commands", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "保存 Redis 快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Redis Command" + ], + "summary": "Save redis command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RedisCommand" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "command" + ], + "formatEN": "save quick command for redis [name][command]", + "formatZH": "保存 redis 快捷命令 [name][command]", + "paramKeys": [] + } + } + }, + "/hosts/command/redis/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 redis 快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Redis Command" + ], + "summary": "Delete redis command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "redis_commands", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete quick command of redis [names]", + "formatZH": "删除 redis 快捷命令 [names]", + "paramKeys": [] + } + } + }, + "/hosts/command/redis/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 redis 快速命令列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Redis Command" + ], + "summary": "Page redis commands", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/hosts/command/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快速命令列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Page commands", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/hosts/command/tree": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快速命令树", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Tree commands", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + } + }, + "/hosts/command/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新快速命令", + "consumes": [ + "application/json" + ], + "tags": [ + "Command" + ], + "summary": "Update command", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommandOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "update quick command [name]", + "formatZH": "更新快捷命令 [name]", + "paramKeys": [] + } + } + }, + "/hosts/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除主机", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Delete host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "hosts", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "addr", + "output_value": "addrs" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete host [addrs]", + "formatZH": "删除主机 [addrs]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取防火墙基础信息", + "tags": [ + "Firewall" + ], + "summary": "Load firewall base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.FirewallBaseInfo" + } + } + } + } + }, + "/hosts/firewall/batch": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "批量删除防火墙规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/firewall/forward": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新防火墙端口转发规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ForwardRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "source_port" + ], + "formatEN": "update port forward rules [source_port]", + "formatZH": "更新端口转发规则 [source_port]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/ip": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建防火墙 IP 规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.AddrRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "strategy", + "address" + ], + "formatEN": "create address rules [strategy][address]", + "formatZH": "添加 ip 规则 [strategy] [address]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改防火墙状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Page firewall status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FirewallOperation" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] firewall", + "formatZH": "[operation] 防火墙", + "paramKeys": [] + } + } + }, + "/hosts/firewall/port": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建防火墙端口规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PortRuleOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "port", + "strategy" + ], + "formatEN": "create port rules [strategy][port]", + "formatZH": "添加端口规则 [strategy] [port]", + "paramKeys": [] + } + } + }, + "/hosts/firewall/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取防火墙规则列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Page firewall rules", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RuleSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/hosts/firewall/update/addr": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 ip 防火墙规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.AddrRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/firewall/update/description": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新防火墙描述", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Update rule description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateFirewallDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/firewall/update/port": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新端口防火墙规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Firewall" + ], + "summary": "Create group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PortRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/monitor/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空监控数据", + "tags": [ + "Monitor" + ], + "summary": "Clean monitor datas", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "clean monitor datas", + "formatZH": "清空监控数据", + "paramKeys": [] + } + } + }, + "/hosts/monitor/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取监控数据", + "tags": [ + "Monitor" + ], + "summary": "Load monitor datas", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MonitorSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取主机列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Page host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchHostWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.HostTree" + } + } + } + } + } + }, + "/hosts/test/byid/:id": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "测试主机连接", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Test host conn by host id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "boolean" + } + } + } + } + }, + "/hosts/test/byinfo": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "测试主机连接", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Test host conn by info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.HostConnTest" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/hosts/tree": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载主机树", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Load host tree", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchForTree" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.HostTree" + } + } + } + } + } + }, + "/hosts/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新主机", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Update host", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.HostOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "addr" + ], + "formatEN": "update host [name][addr]", + "formatZH": "更新主机信息 [name][addr]", + "paramKeys": [] + } + } + }, + "/hosts/update/group": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "切换分组", + "consumes": [ + "application/json" + ], + "tags": [ + "Host" + ], + "summary": "Update host group", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeHostGroup" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "hosts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "addr", + "output_value": "addr" + } + ], + "bodyKeys": [ + "id", + "group" + ], + "formatEN": "change host [addr] group =\u003e [group]", + "formatZH": "切换主机[addr]分组 =\u003e [group]", + "paramKeys": [] + } + } + }, + "/logs/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空操作日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Logs" + ], + "summary": "Clean operation logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CleanLog" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "logType" + ], + "formatEN": "Clean the [logType] log information", + "formatZH": "清空 [logType] 日志信息", + "paramKeys": [] + } + } + }, + "/logs/login": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统登录日志列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Logs" + ], + "summary": "Page login logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchLgLogWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/logs/operation": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统操作日志列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Logs" + ], + "summary": "Page operation logs", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchOpLogWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/logs/system": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统日志", + "tags": [ + "Logs" + ], + "summary": "Load system logs", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/logs/system/files": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统日志文件列表", + "tags": [ + "Logs" + ], + "summary": "Load system log files", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/openresty": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 OpenResty 配置信息", + "tags": [ + "OpenResty" + ], + "summary": "Load OpenResty conf", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/openresty/clear": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清理 OpenResty 代理缓存", + "tags": [ + "OpenResty" + ], + "summary": "Clear OpenResty proxy cache", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Clear nginx proxy cache", + "formatZH": "清理 Openresty 代理缓存", + "paramKeys": [] + } + } + }, + "/openresty/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传更新 OpenResty 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "OpenResty" + ], + "summary": "Update OpenResty conf by upload file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxConfigFileUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Update nginx conf", + "formatZH": "更新 nginx 配置", + "paramKeys": [] + } + } + }, + "/openresty/scope": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取部分 OpenResty 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "OpenResty" + ], + "summary": "Load partial OpenResty conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxScopeReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.NginxParam" + } + } + } + } + } + }, + "/openresty/status": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 OpenResty 状态信息", + "tags": [ + "OpenResty" + ], + "summary": "Load OpenResty status info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.NginxStatus" + } + } + } + } + }, + "/openresty/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 OpenResty 配置信息", + "consumes": [ + "application/json" + ], + "tags": [ + "OpenResty" + ], + "summary": "Update OpenResty conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxConfigUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Update nginx conf [domain]", + "formatZH": "更新 nginx 配置 [domain]", + "paramKeys": [] + } + } + }, + "/process/stop": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "停止进程", + "tags": [ + "Process" + ], + "summary": "Stop Process", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ProcessReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "PID" + ], + "formatEN": "结束进程 [PID]", + "formatZH": "结束进程 [PID]", + "paramKeys": [] + } + } + }, + "/runtimes": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Create runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Create runtime [name]", + "formatZH": "创建运行环境 [name]", + "paramKeys": [] + } + } + }, + "/runtimes/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Get runtime", + "parameters": [ + { + "type": "string", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Delete runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website [name]", + "formatZH": "删除网站 [name]", + "paramKeys": [] + } + } + }, + "/runtimes/node/modules": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Node 项目的 modules", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Get Node modules", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NodeModuleReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/node/modules/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作 Node 项目 modules", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Operate Node modules", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NodeModuleReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/node/package": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Node 项目的 scripts", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Get Node package scripts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NodePackageReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Operate runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "id" + ], + "formatEN": "Operate runtime [name]", + "formatZH": "操作运行环境 [name]", + "paramKeys": [] + } + } + }, + "/runtimes/php/extensions": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Create Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Create Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/php/extensions/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Delete Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Delete Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/php/extensions/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Page Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Page Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.PHPExtensionsDTO" + } + } + } + } + } + }, + "/runtimes/php/extensions/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Update Extensions", + "consumes": [ + "application/json" + ], + "tags": [ + "PHP Extensions" + ], + "summary": "Update Extensions", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.PHPExtensionsUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取运行环境列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "List runtimes", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步运行环境状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Sync runtime status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/runtimes/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新运行环境", + "consumes": [ + "application/json" + ], + "tags": [ + "Runtime" + ], + "summary": "Update runtime", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.RuntimeUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Update runtime [name]", + "formatZH": "更新运行环境 [name]", + "paramKeys": [] + } + } + }, + "/settings/backup": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建备份账号", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Create backup account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BackupOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "create backup account [type]", + "formatZH": "创建备份账号 [type]", + "paramKeys": [] + } + } + }, + "/settings/backup/backup": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "备份系统数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Backup system data", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommonBackup" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name", + "detailName" + ], + "formatEN": "backup [type] data [name][detailName]", + "formatZH": "备份 [type] 数据 [name][detailName]", + "paramKeys": [] + } + } + }, + "/settings/backup/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除备份账号", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Delete backup account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "backup_accounts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "type", + "output_value": "types" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "delete backup account [types]", + "formatZH": "删除备份账号 [types]", + "paramKeys": [] + } + } + }, + "/settings/backup/onedrive": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 OneDrive 信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Load OneDrive info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.OneDriveInfo" + } + } + } + } + }, + "/settings/backup/record/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除备份记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Delete backup record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "backup_records", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "file_name", + "output_value": "files" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete backup records [files]", + "formatZH": "删除备份记录 [files]", + "paramKeys": [] + } + } + }, + "/settings/backup/record/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载备份记录", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Download backup record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.DownloadRecord" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "source", + "fileName" + ], + "formatEN": "download backup records [source][fileName]", + "formatZH": "下载备份记录 [source][fileName]", + "paramKeys": [] + } + } + }, + "/settings/backup/record/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取备份记录列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Page backup records", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RecordSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/backup/record/search/bycronjob": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过计划任务获取备份记录列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Page backup records by cronjob", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.RecordSearchByCronjob" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/backup/recover": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "恢复系统数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Recover system data", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommonRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name", + "detailName", + "file" + ], + "formatEN": "recover [type] data [name][detailName] from [file]", + "formatZH": "从 [file] 恢复 [type] 数据 [name][detailName]", + "paramKeys": [] + } + } + }, + "/settings/backup/recover/byupload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从上传恢复系统数据", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Recover system data by upload", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CommonRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type", + "name", + "detailName", + "file" + ], + "formatEN": "recover [type] data [name][detailName] from [file]", + "formatZH": "从 [file] 恢复 [type] 数据 [name][detailName]", + "paramKeys": [] + } + } + }, + "/settings/backup/refresh/onedrive": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "刷新 OneDrive token", + "tags": [ + "Backup Account" + ], + "summary": "Refresh OneDrive token", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/backup/search": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取备份账号列表", + "tags": [ + "Backup Account" + ], + "summary": "List backup accounts", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.BackupInfo" + } + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 bucket 列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "List buckets", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ForBuckets" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/settings/backup/search/files": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取备份账号内文件列表", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "List files from backup accounts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BackupSearchFile" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/settings/backup/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新备份账号信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Backup Account" + ], + "summary": "Update backup account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BackupOperate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "update backup account [types]", + "formatZH": "更新备份账号 [types]", + "paramKeys": [] + } + } + }, + "/settings/basedir": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取安装根目录", + "tags": [ + "System Setting" + ], + "summary": "Load local backup dir", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/settings/bind/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统监听信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system bind info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BindInfo" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "ipv6", + "bindAddress" + ], + "formatEN": "update system bind info =\u003e ipv6: [ipv6], 监听 IP: [bindAddress]", + "formatZH": "修改系统监听信息 =\u003e ipv6: [ipv6], 监听 IP: [bindAddress]", + "paramKeys": [] + } + } + }, + "/settings/expired/handle": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "重置过期系统登录密码", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Reset system password expired", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PasswordUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "reset an expired Password", + "formatZH": "重置过期密码", + "paramKeys": [] + } + } + }, + "/settings/interface": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统地址信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load system address", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/menu/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "隐藏高级功能菜单", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Hide advanced feature menu.", + "formatZH": "隐藏高级功能菜单", + "paramKeys": [] + } + } + }, + "/settings/mfa": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 mfa 信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load mfa info", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MfaCredential" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/mfa.Otp" + } + } + } + } + }, + "/settings/mfa/bind": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mfa 绑定", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Bind mfa", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.MfaCredential" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "bind mfa", + "formatZH": "mfa 绑定", + "paramKeys": [] + } + } + }, + "/settings/password/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统登录密码", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system password", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PasswordUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "update system password", + "formatZH": "修改系统密码", + "paramKeys": [] + } + } + }, + "/settings/port/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统端口", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system port", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PortUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "serverPort" + ], + "formatEN": "update system port =\u003e [serverPort]", + "formatZH": "修改系统端口 =\u003e [serverPort]", + "paramKeys": [] + } + } + }, + "/settings/proxy/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "服务器代理配置", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update proxy setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ProxyUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "proxyUrl", + "proxyPort" + ], + "formatEN": "set proxy [proxyPort]:[proxyPort].", + "formatZH": "服务器代理配置 [proxyPort]:[proxyPort]", + "paramKeys": [] + } + } + }, + "/settings/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "加载系统配置信息", + "tags": [ + "System Setting" + ], + "summary": "Load system setting info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SettingInfo" + } + } + } + } + }, + "/settings/search/available": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统可用状态", + "tags": [ + "System Setting" + ], + "summary": "Load system available status", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/snapshot": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建系统快照", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Create system snapshot", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "from", + "description" + ], + "formatEN": "Create system backup [description] to [from]", + "formatZH": "创建系统快照 [description] 到 [from]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除系统快照", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Delete system backup", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotBatchDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "Delete system backup [name]", + "formatZH": "删除系统快照 [name]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/description/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新快照描述信息", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update snapshot description", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateDescription" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "description" + ], + "formatEN": "The description of the snapshot [name] is modified =\u003e [description]", + "formatZH": "快照 [name] 描述信息修改 [description]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/import": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "导入已有快照", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Import system snapshot", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotImport" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "from", + "names" + ], + "formatEN": "Sync system snapshots [names] from [from]", + "formatZH": "从 [from] 同步系统快照 [names]", + "paramKeys": [] + } + } + }, + "/settings/snapshot/recover": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从系统快照恢复", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Recover system backup", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Recover from system backup [name]", + "formatZH": "从系统快照 [name] 恢复", + "paramKeys": [] + } + } + }, + "/settings/snapshot/rollback": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "从系统快照回滚", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Rollback system backup", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SnapshotRecover" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "snapshots", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Rollback from system backup [name]", + "formatZH": "从系统快照 [name] 回滚", + "paramKeys": [] + } + } + }, + "/settings/snapshot/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统快照列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Page system snapshot", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/settings/snapshot/status": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取快照状态", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load Snapshot status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/ssl/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载证书", + "tags": [ + "System Setting" + ], + "summary": "Download system cert", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings/ssl/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取证书信息", + "tags": [ + "System Setting" + ], + "summary": "Load system cert info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.SettingInfo" + } + } + } + } + }, + "/settings/ssl/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统 ssl 登录", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SSLUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "ssl" + ], + "formatEN": "update system ssl =\u003e [ssl]", + "formatZH": "修改系统 ssl =\u003e [ssl]", + "paramKeys": [] + } + } + }, + "/settings/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新系统配置", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Update system setting", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update system setting [key] =\u003e [value]", + "formatZH": "修改系统配置 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/settings/upgrade": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取版本 release notes", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Load release notes by version", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Upgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "系统更新", + "consumes": [ + "application/json" + ], + "tags": [ + "System Setting" + ], + "summary": "Upgrade", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Upgrade" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "version" + ], + "formatEN": "upgrade system =\u003e [version]", + "formatZH": "更新系统 =\u003e [version]", + "paramKeys": [] + } + } + }, + "/toolbox/clam": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建扫描规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Create clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "path" + ], + "formatEN": "create clam [name][path]", + "formatZH": "创建扫描规则 [name][path]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Clam 基础信息", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Load clam base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ClamBaseInfo" + } + } + } + } + }, + "/toolbox/clam/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除扫描规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Delete clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "name", + "output_value": "names" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete clam [names]", + "formatZH": "删除扫描规则 [names]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/file/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Load clam file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamFileReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/clam/file/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新病毒扫描配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Update clam file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateByNameAndFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/clam/handle": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "执行病毒扫描", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Handle clam scan", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "id", + "isList": true, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "handle clam scan [name]", + "formatZH": "执行病毒扫描 [name]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 Clam 状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Operate Clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] FTP", + "formatZH": "[operation] Clam", + "paramKeys": [] + } + } + }, + "/toolbox/clam/record/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清空扫描报告", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Clean clam record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperateByID" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "id", + "isList": true, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "clean clam record [name]", + "formatZH": "清空扫描报告 [name]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/record/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描结果详情", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Load clam record detail", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamLogReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/clam/record/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描结果列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Page clam record", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamLogSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/clam/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取扫描规则列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Page clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/clam/status/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改扫描规则状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Update clam status", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamUpdateStatus" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "clams", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id", + "status" + ], + "formatEN": "change the status of clam [name] to [status].", + "formatZH": "修改扫描规则 [name] 状态为 [status]", + "paramKeys": [] + } + } + }, + "/toolbox/clam/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改扫描规则", + "consumes": [ + "application/json" + ], + "tags": [ + "Clam" + ], + "summary": "Update clam", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ClamUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name", + "path" + ], + "formatEN": "update clam [name][path]", + "formatZH": "修改扫描规则 [name][path]", + "paramKeys": [] + } + } + }, + "/toolbox/clean": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "清理系统垃圾文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Clean system", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Clean" + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "Clean system junk files", + "formatZH": "清理系统垃圾文件", + "paramKeys": [] + } + } + }, + "/toolbox/device/base": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取设备基础信息", + "tags": [ + "Device" + ], + "summary": "Load device base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.DeviceBaseInfo" + } + } + } + } + }, + "/toolbox/device/check/dns": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "检查系统 DNS 配置可用性", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Check device DNS conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "load conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.OperationWithName" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/update/byconf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过文件修改配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device conf by file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateByNameAndFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/update/conf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统参数", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SettingUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update device conf [key] =\u003e [value]", + "formatZH": "修改主机参数 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/toolbox/device/update/host": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统 hosts", + "tags": [ + "Device" + ], + "summary": "Update device hosts", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update device host [key] =\u003e [value]", + "formatZH": "修改主机 Host [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/toolbox/device/update/passwd": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统密码", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device passwd", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangePasswd" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/device/update/swap": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改系统 Swap", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "Update device swap", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SwapHelper" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operate", + "path" + ], + "formatEN": "[operate] device swap [path]", + "formatZH": "[operate] 主机 swap [path]", + "paramKeys": [] + } + } + }, + "/toolbox/device/zone/options": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取系统可用时区选项", + "consumes": [ + "application/json" + ], + "tags": [ + "Device" + ], + "summary": "list time zone options", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + } + }, + "/toolbox/fail2ban/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Fail2ban 基础信息", + "tags": [ + "Fail2ban" + ], + "summary": "Load fail2ban base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.Fail2BanBaseInfo" + } + } + } + } + }, + "/toolbox/fail2ban/load/conf": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 fail2ban 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Load fail2ban conf", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/fail2ban/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 Fail2ban 状态", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Operate fail2ban", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] Fail2ban", + "formatZH": "[operation] Fail2ban", + "paramKeys": [] + } + } + }, + "/toolbox/fail2ban/operate/sshd": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "配置 sshd", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Operate sshd of fail2ban", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {} + } + }, + "/toolbox/fail2ban/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 Fail2ban ip", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Page fail2ban ip list", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Fail2BanSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "Array" + } + } + } + } + }, + "/toolbox/fail2ban/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 Fail2ban 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Update fail2ban conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Fail2BanUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "key", + "value" + ], + "formatEN": "update fail2ban conf [key] =\u003e [value]", + "formatZH": "修改 Fail2ban 配置 [key] =\u003e [value]", + "paramKeys": [] + } + } + }, + "/toolbox/fail2ban/update/byconf": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过文件修改 fail2ban 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Fail2ban" + ], + "summary": "Update fail2ban conf by file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateByFile" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/toolbox/ftp": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Create FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FtpCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "user", + "path" + ], + "formatEN": "create FTP [user][path]", + "formatZH": "创建 FTP 账户 [user][path]", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/base": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 FTP 基础信息", + "tags": [ + "FTP" + ], + "summary": "Load FTP base info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.FtpBaseInfo" + } + } + } + } + }, + "/toolbox/ftp/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Delete FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "ftps", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "user", + "output_value": "users" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "delete FTP users [users]", + "formatZH": "删除 FTP 账户 [users]", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/log/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 FTP 操作日志", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Load FTP operation log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FtpLogSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/ftp/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 FTP 状态", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Operate FTP", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.Operate" + } + } + ], + "responses": {}, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "operation" + ], + "formatEN": "[operation] FTP", + "formatZH": "[operation] FTP", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 FTP 账户列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Page FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SearchWithPage" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/toolbox/ftp/sync": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "同步 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Sync FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.BatchDeleteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "sync FTP users", + "formatZH": "同步 FTP 账户", + "paramKeys": [] + } + } + }, + "/toolbox/ftp/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改 FTP 账户", + "consumes": [ + "application/json" + ], + "tags": [ + "FTP" + ], + "summary": "Update FTP user", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.FtpUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "user", + "path" + ], + "formatEN": "update FTP [user][path]", + "formatZH": "修改 FTP 账户 [user][path]", + "paramKeys": [] + } + } + }, + "/toolbox/scan": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "扫描系统垃圾文件", + "tags": [ + "Device" + ], + "summary": "Scan system", + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [], + "formatEN": "scan System Junk Files", + "formatZH": "扫描系统垃圾文件", + "paramKeys": [] + } + } + }, + "/websites": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Create website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "primaryDomain" + ], + "formatEN": "Create website [primaryDomain]", + "formatZH": "创建网站 [primaryDomain]", + "paramKeys": [] + } + } + }, + "/websites/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 查询网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Search website by id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteDTO" + } + } + } + } + }, + "/websites/:id/config/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 查询网站 nginx", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Search website nginx by id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/websites/:id/https": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 https 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website HTTPS" + ], + "summary": "Load https conf", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteHTTPS" + } + } + } + }, + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 https 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website HTTPS" + ], + "summary": "Update https conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteHTTPSOp" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteHTTPS" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Update website https [domain] conf", + "formatZH": "更新网站 [domain] https 配置", + "paramKeys": [] + } + } + }, + "/websites/acme": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 acme", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Acme" + ], + "summary": "Create website acme account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteAcmeAccountCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteAcmeAccountDTO" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "email" + ], + "formatEN": "Create website acme [email]", + "formatZH": "创建网站 acme [email]", + "paramKeys": [] + } + } + }, + "/websites/acme/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 acme", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Acme" + ], + "summary": "Delete website acme account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_acme_accounts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "email", + "output_value": "email" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website acme [email]", + "formatZH": "删除网站 acme [email]", + "paramKeys": [] + } + } + }, + "/websites/acme/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 acme 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Acme" + ], + "summary": "Page website acme accounts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/auths": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取密码访问配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get AuthBasic conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxAuthReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/auths/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新密码访问配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get AuthBasic conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxAuthUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/ca": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 ca", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Create website ca", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCACreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/request.WebsiteCACreate" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Create website ca [name]", + "formatZH": "创建网站 ca [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 ca", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Delete website ca", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCommonReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website ca [name]", + "formatZH": "删除网站 ca [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载 CA 证书文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Download CA file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "download ca file [name]", + "formatZH": "下载 CA 证书文件 [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/obtain": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "自签 SSL 证书", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Obtain SSL", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCAObtain" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Obtain SSL [name]", + "formatZH": "自签 SSL 证书 [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/renew": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "续签 SSL 证书", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Obtain SSL", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCAObtain" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_cas", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Obtain SSL [name]", + "formatZH": "自签 SSL 证书 [name]", + "paramKeys": [] + } + } + }, + "/websites/ca/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 ca 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Page website ca", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCASearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/ca/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 ca", + "consumes": [ + "application/json" + ], + "tags": [ + "Website CA" + ], + "summary": "Get website ca", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteCADTO" + } + } + } + } + }, + "/websites/check": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "网站创建前检查", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Check before create website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteInstallCheckReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.WebsitePreInstallCheck" + } + } + } + } + } + }, + "/websites/config": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取 nginx 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Load nginx conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxScopeReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteNginxConfig" + } + } + } + } + }, + "/websites/config/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 nginx 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Update nginx conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxConfigUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Nginx conf update [domain]", + "formatZH": "nginx 配置修改 [domain]", + "paramKeys": [] + } + } + }, + "/websites/default/html/:type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取默认 html", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get default html", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.FileInfo" + } + } + } + } + }, + "/websites/default/html/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新默认 html", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update default html", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteHtmlUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "Update default html", + "formatZH": "更新默认 html", + "paramKeys": [] + } + } + }, + "/websites/default/server": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作网站日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Change default server", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDefaultUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id", + "operate" + ], + "formatEN": "Change default server =\u003e [domain]", + "formatZH": "修改默认 server =\u003e [domain]", + "paramKeys": [] + } + } + }, + "/websites/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Delete website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website [domain]", + "formatZH": "删除网站 [domain]", + "paramKeys": [] + } + } + }, + "/websites/dir": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站目录配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get website dir", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteCommonReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/dir/permission": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站目录权限", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update Site Dir permission", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteUpdateDirPermission" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update domain [domain] dir permission", + "formatZH": "更新网站 [domain] 目录权限", + "paramKeys": [] + } + } + }, + "/websites/dir/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站目录", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update Site Dir", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteUpdateDir" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update domain [domain] dir", + "formatZH": "更新网站 [domain] 目录", + "paramKeys": [] + } + } + }, + "/websites/dns": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 dns", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Create website dns account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDnsAccountCreate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Create website dns [name]", + "formatZH": "创建网站 dns [name]", + "paramKeys": [] + } + } + }, + "/websites/dns/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 dns", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Delete website dns account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_dns_accounts", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "name", + "output_value": "name" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete website dns [name]", + "formatZH": "删除网站 dns [name]", + "paramKeys": [] + } + } + }, + "/websites/dns/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 dns 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Page website dns accounts", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PageInfo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/dns/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站 dns", + "consumes": [ + "application/json" + ], + "tags": [ + "Website DNS" + ], + "summary": "Update website dns account", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDnsAccountUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "name" + ], + "formatEN": "Update website dns [name]", + "formatZH": "更新网站 dns [name]", + "paramKeys": [] + } + } + }, + "/websites/domains": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站域名", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Domain" + ], + "summary": "Create website domain", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDomainCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/model.WebsiteDomain" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "domain" + ], + "formatEN": "Create domain [domain]", + "formatZH": "创建域名 [domain]", + "paramKeys": [] + } + } + }, + "/websites/domains/:websiteId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过网站 id 查询域名", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Domain" + ], + "summary": "Search website domains by websiteId", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "websiteId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/model.WebsiteDomain" + } + } + } + } + } + }, + "/websites/domains/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站域名", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Domain" + ], + "summary": "Delete website domain", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDomainDelete" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_domains", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Delete domain [domain]", + "formatZH": "删除域名 [domain]", + "paramKeys": [] + } + } + }, + "/websites/leech": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取防盗链配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get AntiLeech conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxCommonReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/leech/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新防盗链配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update AntiLeech", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxAntiLeechUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站列表", + "tags": [ + "Website" + ], + "summary": "List websites", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.WebsiteDTO" + } + } + } + } + } + }, + "/websites/log": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作网站日志", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Operate website log", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteLogReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.WebsiteLog" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id", + "operate" + ], + "formatEN": "[domain][operate] logs", + "formatZH": "[domain][operate] 日志", + "paramKeys": [] + } + } + }, + "/websites/nginx/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 网站 nginx 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website Nginx" + ], + "summary": "Update website nginx conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteNginxUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "[domain] Nginx conf update", + "formatZH": "[domain] Nginx 配置修改", + "paramKeys": [] + } + } + }, + "/websites/operate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "操作网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Operate website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteOp" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id", + "operate" + ], + "formatEN": "[operate] website [domain]", + "formatZH": "[operate] 网站 [domain]", + "paramKeys": [] + } + } + }, + "/websites/options": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站列表", + "tags": [ + "Website" + ], + "summary": "List website names", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/websites/php/config": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 网站 PHP 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website PHP" + ], + "summary": "Update website php conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsitePHPConfigUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "[domain] PHP conf update", + "formatZH": "[domain] PHP 配置修改", + "paramKeys": [] + } + } + }, + "/websites/php/config/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 php 配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Load website php conf", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.PHPConfig" + } + } + } + } + }, + "/websites/php/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 php 配置文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website PHP" + ], + "summary": "Update php conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsitePHPFileUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "Nginx conf update [domain]", + "formatZH": "php 配置修改 [domain]", + "paramKeys": [] + } + } + }, + "/websites/php/version": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "变更 php 版本", + "consumes": [ + "application/json" + ], + "tags": [ + "Website PHP" + ], + "summary": "Update php version", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsitePHPVersionReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteId", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteId" + ], + "formatEN": "php version update [domain]", + "formatZH": "php 版本变更 [domain]", + "paramKeys": [] + } + } + }, + "/websites/proxies": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取反向代理配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get proxy conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteProxyReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/proxies/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改反向代理配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update proxy conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteProxyConfig" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update domain [domain] proxy config", + "formatZH": "修改网站 [domain] 反向代理配置 ", + "paramKeys": [] + } + } + }, + "/websites/proxy/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新反向代理文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update proxy file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxProxyUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf proxy file update [domain]", + "formatZH": "更新反向代理文件 [domain]", + "paramKeys": [] + } + } + }, + "/websites/redirect": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取重定向配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get redirect conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteProxyReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/redirect/file": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新重定向文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update redirect file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRedirectUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf redirect file update [domain]", + "formatZH": "更新重定向文件 [domain]", + "paramKeys": [] + } + } + }, + "/websites/redirect/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改重定向配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update redirect conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRedirectReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Update domain [domain] redirect config", + "formatZH": "修改网站 [domain] 重定向理配置 ", + "paramKeys": [] + } + } + }, + "/websites/rewrite": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/rewrite/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "websites", + "input_column": "id", + "input_value": "websiteID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf rewrite update [domain]", + "formatZH": "伪静态配置修改 [domain]", + "paramKeys": [] + } + } + }, + "/websites/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Page websites", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSearch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PageResult" + } + } + } + } + }, + "/websites/ssl": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "创建网站 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Create website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/request.WebsiteSSLCreate" + } + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "primaryDomain" + ], + "formatEN": "Create website ssl [primaryDomain]", + "formatZH": "创建网站 ssl [primaryDomain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/:id": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过 id 查询 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Search website ssl by id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/ssl/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除网站 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Delete website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteBatchDelReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "ids", + "isList": true, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "ids" + ], + "formatEN": "Delete ssl [domain]", + "formatZH": "删除 ssl [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/download": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "下载证书文件", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Download SSL file", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteResourceReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "download ssl file [domain]", + "formatZH": "下载证书文件 [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/obtain": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "申请证书", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Apply ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLApply" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "ID", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "ID" + ], + "formatEN": "apply ssl [domain]", + "formatZH": "申请证书 [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/resolve": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "解析网站 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Resolve website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteDNSReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/response.WebsiteDNSRes" + } + } + } + } + } + }, + "/websites/ssl/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取网站 ssl 列表分页", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Page website ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLSearch" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/ssl/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Update ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [ + { + "db": "website_ssls", + "input_column": "id", + "input_value": "id", + "isList": false, + "output_column": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "id" + ], + "formatEN": "Update ssl config [domain]", + "formatZH": "更新证书设置 [domain]", + "paramKeys": [] + } + } + }, + "/websites/ssl/upload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "上传 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Upload ssl", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteSSLUpload" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "type" + ], + "formatEN": "Upload ssl [type]", + "formatZH": "上传 ssl [type]", + "paramKeys": [] + } + } + }, + "/websites/ssl/website/:websiteId": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "通过网站 id 查询 ssl", + "consumes": [ + "application/json" + ], + "tags": [ + "Website SSL" + ], + "summary": "Search website ssl by website id", + "parameters": [ + { + "type": "integer", + "description": "request", + "name": "websiteId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新网站", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update website", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.WebsiteUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFunctions": [], + "bodyKeys": [ + "primaryDomain" + ], + "formatEN": "Update website [primaryDomain]", + "formatZH": "更新网站 [primaryDomain]", + "paramKeys": [] + } + } + } + }, + "definitions": { + "dto.AddrRuleOperate": { + "type": "object", + "required": [ + "address", + "operation", + "strategy" + ], + "properties": { + "address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "strategy": { + "type": "string", + "enum": [ + "accept", + "drop" + ] + } + } + }, + "dto.AddrRuleUpdate": { + "type": "object", + "properties": { + "newRule": { + "$ref": "#/definitions/dto.AddrRuleOperate" + }, + "oldRule": { + "$ref": "#/definitions/dto.AddrRuleOperate" + } + } + }, + "dto.AppInstallInfo": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.AppResource": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.AppVersion": { + "type": "object", + "properties": { + "detailId": { + "type": "integer" + }, + "dockerCompose": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.BackupInfo": { + "type": "object", + "properties": { + "backupPath": { + "type": "string" + }, + "bucket": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "vars": { + "type": "string" + } + } + }, + "dto.BackupOperate": { + "type": "object", + "required": [ + "type", + "vars" + ], + "properties": { + "accessKey": { + "type": "string" + }, + "backupPath": { + "type": "string" + }, + "bucket": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "vars": { + "type": "string" + } + } + }, + "dto.BackupSearchFile": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + } + }, + "dto.BatchDelete": { + "type": "object", + "required": [ + "names" + ], + "properties": { + "force": { + "type": "boolean" + }, + "names": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.BatchDeleteReq": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.BatchRuleOperate": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PortRuleOperate" + } + }, + "type": { + "type": "string" + } + } + }, + "dto.BindInfo": { + "type": "object", + "required": [ + "bindAddress", + "ipv6" + ], + "properties": { + "bindAddress": { + "type": "string" + }, + "ipv6": { + "type": "string", + "enum": [ + "enable", + "disable" + ] + } + } + }, + "dto.BindUser": { + "type": "object", + "required": [ + "database", + "db", + "password", + "permission", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "db": { + "type": "string" + }, + "password": { + "type": "string" + }, + "permission": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "dto.CaptchaResponse": { + "type": "object", + "properties": { + "captchaID": { + "type": "string" + }, + "imagePath": { + "type": "string" + } + } + }, + "dto.ChangeDBInfo": { + "type": "object", + "required": [ + "database", + "from", + "type", + "value" + ], + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb", + "postgresql" + ] + }, + "value": { + "type": "string" + } + } + }, + "dto.ChangeHostGroup": { + "type": "object", + "required": [ + "groupID", + "id" + ], + "properties": { + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + } + } + }, + "dto.ChangePasswd": { + "type": "object", + "properties": { + "passwd": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.ChangeRedisPass": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "database": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "dto.ClamBaseInfo": { + "type": "object", + "properties": { + "freshIsActive": { + "type": "boolean" + }, + "freshIsExist": { + "type": "boolean" + }, + "freshVersion": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "isExist": { + "type": "boolean" + }, + "version": { + "type": "string" + } + } + }, + "dto.ClamCreate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "infectedDir": { + "type": "string" + }, + "infectedStrategy": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.ClamDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "removeInfected": { + "type": "boolean" + }, + "removeRecord": { + "type": "boolean" + } + } + }, + "dto.ClamFileReq": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "tail": { + "type": "string" + } + } + }, + "dto.ClamLogReq": { + "type": "object", + "properties": { + "clamName": { + "type": "string" + }, + "recordName": { + "type": "string" + }, + "tail": { + "type": "string" + } + } + }, + "dto.ClamLogSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "clamID": { + "type": "integer" + }, + "endTime": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "startTime": { + "type": "string" + } + } + }, + "dto.ClamUpdate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "infectedDir": { + "type": "string" + }, + "infectedStrategy": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "spec": { + "type": "string" + } + } + }, + "dto.ClamUpdateStatus": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "dto.Clean": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "treeType": { + "type": "string" + } + } + }, + "dto.CleanLog": { + "type": "object", + "required": [ + "logType" + ], + "properties": { + "logType": { + "type": "string", + "enum": [ + "login", + "operation" + ] + } + } + }, + "dto.CommandInfo": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "groupBelong": { + "type": "string" + }, + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.CommandOperate": { + "type": "object", + "required": [ + "command", + "name" + ], + "properties": { + "command": { + "type": "string" + }, + "groupBelong": { + "type": "string" + }, + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.CommonBackup": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "detailName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "app", + "mysql", + "mariadb", + "redis", + "website", + "postgresql" + ] + } + } + }, + "dto.CommonRecover": { + "type": "object", + "required": [ + "source", + "type" + ], + "properties": { + "detailName": { + "type": "string" + }, + "file": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "OSS", + "S3", + "SFTP", + "MINIO", + "LOCAL", + "COS", + "KODO", + "OneDrive", + "WebDAV" + ] + }, + "type": { + "type": "string", + "enum": [ + "app", + "mysql", + "mariadb", + "redis", + "website", + "postgresql" + ] + } + } + }, + "dto.ComposeCreate": { + "type": "object", + "required": [ + "from" + ], + "properties": { + "file": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "edit", + "path", + "template" + ] + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "template": { + "type": "integer" + } + } + }, + "dto.ComposeOperation": { + "type": "object", + "required": [ + "name", + "operation", + "path" + ], + "properties": { + "name": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "start", + "stop", + "down" + ] + }, + "path": { + "type": "string" + }, + "withFile": { + "type": "boolean" + } + } + }, + "dto.ComposeTemplateCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "content": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.ComposeTemplateInfo": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.ComposeTemplateUpdate": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "dto.ComposeUpdate": { + "type": "object", + "required": [ + "content", + "name", + "path" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "dto.ContainerCommit": { + "type": "object", + "required": [ + "containerID" + ], + "properties": { + "author": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "containerID": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "newImageName": { + "type": "string" + }, + "pause": { + "type": "boolean" + } + } + }, + "dto.ContainerListStats": { + "type": "object", + "properties": { + "containerID": { + "type": "string" + }, + "cpuPercent": { + "type": "number" + }, + "cpuTotalUsage": { + "type": "integer" + }, + "memoryCache": { + "type": "integer" + }, + "memoryLimit": { + "type": "integer" + }, + "memoryPercent": { + "type": "number" + }, + "memoryUsage": { + "type": "integer" + }, + "percpuUsage": { + "type": "integer" + }, + "systemUsage": { + "type": "integer" + } + } + }, + "dto.ContainerOperate": { + "type": "object", + "required": [ + "image", + "name" + ], + "properties": { + "autoRemove": { + "type": "boolean" + }, + "cmd": { + "type": "array", + "items": { + "type": "string" + } + }, + "containerID": { + "type": "string" + }, + "cpuShares": { + "type": "integer" + }, + "entrypoint": { + "type": "array", + "items": { + "type": "string" + } + }, + "env": { + "type": "array", + "items": { + "type": "string" + } + }, + "exposedPorts": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PortHelper" + } + }, + "forcePull": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "ipv4": { + "type": "string" + }, + "ipv6": { + "type": "string" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "memory": { + "type": "number" + }, + "name": { + "type": "string" + }, + "nanoCPUs": { + "type": "number" + }, + "network": { + "type": "string" + }, + "openStdin": { + "type": "boolean" + }, + "privileged": { + "type": "boolean" + }, + "publishAllPorts": { + "type": "boolean" + }, + "restartPolicy": { + "type": "string" + }, + "tty": { + "type": "boolean" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.VolumeHelper" + } + } + } + }, + "dto.ContainerOperation": { + "type": "object", + "required": [ + "names", + "operation" + ], + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + } + }, + "operation": { + "type": "string", + "enum": [ + "start", + "stop", + "restart", + "kill", + "pause", + "unpause", + "remove" + ] + } + } + }, + "dto.ContainerPrune": { + "type": "object", + "required": [ + "pruneType" + ], + "properties": { + "pruneType": { + "type": "string", + "enum": [ + "container", + "image", + "volume", + "network", + "buildcache" + ] + }, + "withTagAll": { + "type": "boolean" + } + } + }, + "dto.ContainerPruneReport": { + "type": "object", + "properties": { + "deletedNumber": { + "type": "integer" + }, + "spaceReclaimed": { + "type": "integer" + } + } + }, + "dto.ContainerRename": { + "type": "object", + "required": [ + "name", + "newName" + ], + "properties": { + "name": { + "type": "string" + }, + "newName": { + "type": "string" + } + } + }, + "dto.ContainerStats": { + "type": "object", + "properties": { + "cache": { + "type": "number" + }, + "cpuPercent": { + "type": "number" + }, + "ioRead": { + "type": "number" + }, + "ioWrite": { + "type": "number" + }, + "memory": { + "type": "number" + }, + "networkRX": { + "type": "number" + }, + "networkTX": { + "type": "number" + }, + "shotTime": { + "type": "string" + } + } + }, + "dto.ContainerUpgrade": { + "type": "object", + "required": [ + "image", + "name" + ], + "properties": { + "forcePull": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.CronjobBatchDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "cleanData": { + "type": "boolean" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.CronjobClean": { + "type": "object", + "required": [ + "cronjobID" + ], + "properties": { + "cleanData": { + "type": "boolean" + }, + "cronjobID": { + "type": "integer" + }, + "isDelete": { + "type": "boolean" + } + } + }, + "dto.CronjobCreate": { + "type": "object", + "required": [ + "name", + "spec", + "type" + ], + "properties": { + "appID": { + "type": "string" + }, + "backupAccounts": { + "type": "string" + }, + "command": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "dbName": { + "type": "string" + }, + "dbType": { + "type": "string" + }, + "defaultDownload": { + "type": "string" + }, + "exclusionRules": { + "type": "string" + }, + "name": { + "type": "string" + }, + "retainCopies": { + "type": "integer", + "minimum": 1 + }, + "script": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "sourceDir": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "dto.CronjobDownload": { + "type": "object", + "required": [ + "backupAccountID", + "recordID" + ], + "properties": { + "backupAccountID": { + "type": "integer" + }, + "recordID": { + "type": "integer" + } + } + }, + "dto.CronjobUpdate": { + "type": "object", + "required": [ + "id", + "name", + "spec" + ], + "properties": { + "appID": { + "type": "string" + }, + "backupAccounts": { + "type": "string" + }, + "command": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "dbName": { + "type": "string" + }, + "dbType": { + "type": "string" + }, + "defaultDownload": { + "type": "string" + }, + "exclusionRules": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "retainCopies": { + "type": "integer", + "minimum": 1 + }, + "script": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "sourceDir": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "url": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "dto.CronjobUpdateStatus": { + "type": "object", + "required": [ + "id", + "status" + ], + "properties": { + "id": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "dto.DBBaseInfo": { + "type": "object", + "properties": { + "containerName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "port": { + "type": "integer" + } + } + }, + "dto.DBConfUpdateByFile": { + "type": "object", + "required": [ + "database", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "file": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb", + "postgresql", + "redis" + ] + } + } + }, + "dto.DaemonJsonConf": { + "type": "object", + "properties": { + "cgroupDriver": { + "type": "string" + }, + "experimental": { + "type": "boolean" + }, + "fixedCidrV6": { + "type": "string" + }, + "insecureRegistries": { + "type": "array", + "items": { + "type": "string" + } + }, + "ip6Tables": { + "type": "boolean" + }, + "iptables": { + "type": "boolean" + }, + "ipv6": { + "type": "boolean" + }, + "isSwarm": { + "type": "boolean" + }, + "liveRestore": { + "type": "boolean" + }, + "logMaxFile": { + "type": "string" + }, + "logMaxSize": { + "type": "string" + }, + "registryMirrors": { + "type": "array", + "items": { + "type": "string" + } + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DaemonJsonUpdateByFile": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + } + }, + "dto.DashboardBase": { + "type": "object", + "properties": { + "appInstalledNumber": { + "type": "integer" + }, + "cpuCores": { + "type": "integer" + }, + "cpuLogicalCores": { + "type": "integer" + }, + "cpuModelName": { + "type": "string" + }, + "cronjobNumber": { + "type": "integer" + }, + "currentInfo": { + "$ref": "#/definitions/dto.DashboardCurrent" + }, + "databaseNumber": { + "type": "integer" + }, + "hostname": { + "type": "string" + }, + "kernelArch": { + "type": "string" + }, + "kernelVersion": { + "type": "string" + }, + "os": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "platformFamily": { + "type": "string" + }, + "platformVersion": { + "type": "string" + }, + "virtualizationSystem": { + "type": "string" + }, + "websiteNumber": { + "type": "integer" + } + } + }, + "dto.DashboardCurrent": { + "type": "object", + "properties": { + "cpuPercent": { + "type": "array", + "items": { + "type": "number" + } + }, + "cpuTotal": { + "type": "integer" + }, + "cpuUsed": { + "type": "number" + }, + "cpuUsedPercent": { + "type": "number" + }, + "diskData": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.DiskInfo" + } + }, + "gpuData": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.GPUInfo" + } + }, + "ioCount": { + "type": "integer" + }, + "ioReadBytes": { + "type": "integer" + }, + "ioReadTime": { + "type": "integer" + }, + "ioWriteBytes": { + "type": "integer" + }, + "ioWriteTime": { + "type": "integer" + }, + "load1": { + "type": "number" + }, + "load15": { + "type": "number" + }, + "load5": { + "type": "number" + }, + "loadUsagePercent": { + "type": "number" + }, + "memoryAvailable": { + "type": "integer" + }, + "memoryTotal": { + "type": "integer" + }, + "memoryUsed": { + "type": "integer" + }, + "memoryUsedPercent": { + "type": "number" + }, + "netBytesRecv": { + "type": "integer" + }, + "netBytesSent": { + "type": "integer" + }, + "procs": { + "type": "integer" + }, + "shotTime": { + "type": "string" + }, + "swapMemoryAvailable": { + "type": "integer" + }, + "swapMemoryTotal": { + "type": "integer" + }, + "swapMemoryUsed": { + "type": "integer" + }, + "swapMemoryUsedPercent": { + "type": "number" + }, + "timeSinceUptime": { + "type": "string" + }, + "uptime": { + "type": "integer" + } + } + }, + "dto.DatabaseCreate": { + "type": "object", + "required": [ + "from", + "name", + "type", + "username", + "version" + ], + "properties": { + "address": { + "type": "string" + }, + "clientCert": { + "type": "string" + }, + "clientKey": { + "type": "string" + }, + "description": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "name": { + "type": "string", + "maxLength": 256 + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "rootCert": { + "type": "string" + }, + "skipVerify": { + "type": "boolean" + }, + "ssl": { + "type": "boolean" + }, + "type": { + "type": "string" + }, + "username": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DatabaseDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + } + }, + "dto.DatabaseInfo": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "clientCert": { + "type": "string" + }, + "clientKey": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string", + "maxLength": 256 + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "rootCert": { + "type": "string" + }, + "skipVerify": { + "type": "boolean" + }, + "ssl": { + "type": "boolean" + }, + "type": { + "type": "string" + }, + "username": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DatabaseItem": { + "type": "object", + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.DatabaseOption": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "database": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DatabaseSearch": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "dto.DatabaseUpdate": { + "type": "object", + "required": [ + "type", + "username", + "version" + ], + "properties": { + "address": { + "type": "string" + }, + "clientCert": { + "type": "string" + }, + "clientKey": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "rootCert": { + "type": "string" + }, + "skipVerify": { + "type": "boolean" + }, + "ssl": { + "type": "boolean" + }, + "type": { + "type": "string" + }, + "username": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.DeviceBaseInfo": { + "type": "object", + "properties": { + "dns": { + "type": "array", + "items": { + "type": "string" + } + }, + "hostname": { + "type": "string" + }, + "hosts": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.HostHelper" + } + }, + "localTime": { + "type": "string" + }, + "maxSize": { + "type": "integer" + }, + "ntp": { + "type": "string" + }, + "swapDetails": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SwapHelper" + } + }, + "swapMemoryAvailable": { + "type": "integer" + }, + "swapMemoryTotal": { + "type": "integer" + }, + "swapMemoryUsed": { + "type": "integer" + }, + "timeZone": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.DiskInfo": { + "type": "object", + "properties": { + "device": { + "type": "string" + }, + "free": { + "type": "integer" + }, + "inodesFree": { + "type": "integer" + }, + "inodesTotal": { + "type": "integer" + }, + "inodesUsed": { + "type": "integer" + }, + "inodesUsedPercent": { + "type": "number" + }, + "path": { + "type": "string" + }, + "total": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "used": { + "type": "integer" + }, + "usedPercent": { + "type": "number" + } + } + }, + "dto.DockerOperation": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string", + "enum": [ + "start", + "restart", + "stop" + ] + } + } + }, + "dto.DownloadRecord": { + "type": "object", + "required": [ + "fileDir", + "fileName", + "source" + ], + "properties": { + "fileDir": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "OSS", + "S3", + "SFTP", + "MINIO", + "LOCAL", + "COS", + "KODO", + "OneDrive", + "WebDAV" + ] + } + } + }, + "dto.Fail2BanBaseInfo": { + "type": "object", + "properties": { + "banAction": { + "type": "string" + }, + "banTime": { + "type": "string" + }, + "findTime": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "isEnable": { + "type": "boolean" + }, + "isExist": { + "type": "boolean" + }, + "logPath": { + "type": "string" + }, + "maxRetry": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "version": { + "type": "string" + } + } + }, + "dto.Fail2BanSearch": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "banned", + "ignore" + ] + } + } + }, + "dto.Fail2BanUpdate": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string", + "enum": [ + "port", + "bantime", + "findtime", + "maxretry", + "banaction", + "logpath", + "port" + ] + }, + "value": { + "type": "string" + } + } + }, + "dto.FirewallBaseInfo": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "pingStatus": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "dto.FirewallOperation": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string", + "enum": [ + "start", + "stop", + "restart", + "disablePing", + "enablePing" + ] + } + } + }, + "dto.ForBuckets": { + "type": "object", + "required": [ + "credential", + "type", + "vars" + ], + "properties": { + "accessKey": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "type": { + "type": "string" + }, + "vars": { + "type": "string" + } + } + }, + "dto.ForwardRuleOperate": { + "type": "object", + "properties": { + "rules": { + "type": "array", + "items": { + "type": "object", + "required": [ + "operation", + "port", + "protocol", + "targetPort" + ], + "properties": { + "num": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "port": { + "type": "string" + }, + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "tcp/udp" + ] + }, + "targetIP": { + "type": "string" + }, + "targetPort": { + "type": "string" + } + } + } + } + } + }, + "dto.FtpBaseInfo": { + "type": "object", + "properties": { + "isActive": { + "type": "boolean" + }, + "isExist": { + "type": "boolean" + } + } + }, + "dto.FtpCreate": { + "type": "object", + "required": [ + "password", + "path", + "user" + ], + "properties": { + "description": { + "type": "string" + }, + "password": { + "type": "string" + }, + "path": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.FtpLogSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "operation": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "user": { + "type": "string" + } + } + }, + "dto.FtpUpdate": { + "type": "object", + "required": [ + "password", + "path" + ], + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string" + }, + "path": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.GPUInfo": { + "type": "object", + "properties": { + "fanSpeed": { + "type": "string" + }, + "gpuUtil": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "maxPowerLimit": { + "type": "string" + }, + "memTotal": { + "type": "string" + }, + "memUsed": { + "type": "string" + }, + "memoryUsage": { + "type": "string" + }, + "performanceState": { + "type": "string" + }, + "powerDraw": { + "type": "string" + }, + "powerUsage": { + "type": "string" + }, + "productName": { + "type": "string" + }, + "temperature": { + "type": "string" + } + } + }, + "dto.GenerateLoad": { + "type": "object", + "required": [ + "encryptionMode" + ], + "properties": { + "encryptionMode": { + "type": "string", + "enum": [ + "rsa", + "ed25519", + "ecdsa", + "dsa" + ] + } + } + }, + "dto.GenerateSSH": { + "type": "object", + "required": [ + "encryptionMode" + ], + "properties": { + "encryptionMode": { + "type": "string", + "enum": [ + "rsa", + "ed25519", + "ecdsa", + "dsa" + ] + }, + "password": { + "type": "string" + } + } + }, + "dto.GroupCreate": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.GroupInfo": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "isDefault": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.GroupSearch": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + } + }, + "dto.GroupUpdate": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "id": { + "type": "integer" + }, + "isDefault": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.HostConnTest": { + "type": "object", + "required": [ + "addr", + "port", + "user" + ], + "properties": { + "addr": { + "type": "string" + }, + "authMode": { + "type": "string", + "enum": [ + "password", + "key" + ] + }, + "passPhrase": { + "type": "string" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer", + "maximum": 65535, + "minimum": 1 + }, + "privateKey": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.HostHelper": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "ip": { + "type": "string" + } + } + }, + "dto.HostOperate": { + "type": "object", + "required": [ + "addr", + "port", + "user" + ], + "properties": { + "addr": { + "type": "string" + }, + "authMode": { + "type": "string", + "enum": [ + "password", + "key" + ] + }, + "description": { + "type": "string" + }, + "groupID": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "passPhrase": { + "type": "string" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer", + "maximum": 65535, + "minimum": 1 + }, + "privateKey": { + "type": "string" + }, + "rememberPassword": { + "type": "boolean" + }, + "user": { + "type": "string" + } + } + }, + "dto.HostTree": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.TreeChild" + } + }, + "id": { + "type": "integer" + }, + "label": { + "type": "string" + } + } + }, + "dto.ImageBuild": { + "type": "object", + "required": [ + "dockerfile", + "from", + "name" + ], + "properties": { + "dockerfile": { + "type": "string" + }, + "from": { + "type": "string" + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.ImageInfo": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isUsed": { + "type": "boolean" + }, + "size": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.ImageLoad": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "dto.ImagePull": { + "type": "object", + "required": [ + "imageName" + ], + "properties": { + "imageName": { + "type": "string" + }, + "repoID": { + "type": "integer" + } + } + }, + "dto.ImagePush": { + "type": "object", + "required": [ + "name", + "repoID", + "tagName" + ], + "properties": { + "name": { + "type": "string" + }, + "repoID": { + "type": "integer" + }, + "tagName": { + "type": "string" + } + } + }, + "dto.ImageRepoDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.ImageRepoOption": { + "type": "object", + "properties": { + "downloadUrl": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.ImageRepoUpdate": { + "type": "object", + "properties": { + "auth": { + "type": "boolean" + }, + "downloadUrl": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string", + "maxLength": 256 + }, + "protocol": { + "type": "string" + }, + "username": { + "type": "string", + "maxLength": 256 + } + } + }, + "dto.ImageSave": { + "type": "object", + "required": [ + "name", + "path", + "tagName" + ], + "properties": { + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "tagName": { + "type": "string" + } + } + }, + "dto.ImageTag": { + "type": "object", + "required": [ + "sourceID", + "targetName" + ], + "properties": { + "sourceID": { + "type": "string" + }, + "targetName": { + "type": "string" + } + } + }, + "dto.InspectReq": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.LogOption": { + "type": "object", + "properties": { + "logMaxFile": { + "type": "string" + }, + "logMaxSize": { + "type": "string" + } + } + }, + "dto.Login": { + "type": "object", + "required": [ + "authMethod", + "language", + "name", + "password" + ], + "properties": { + "authMethod": { + "type": "string", + "enum": [ + "jwt", + "session" + ] + }, + "captcha": { + "type": "string" + }, + "captchaID": { + "type": "string" + }, + "ignoreCaptcha": { + "type": "boolean" + }, + "language": { + "type": "string", + "enum": [ + "zh", + "en", + "tw" + ] + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "dto.MFALogin": { + "type": "object", + "required": [ + "code", + "name", + "password" + ], + "properties": { + "authMethod": { + "type": "string" + }, + "code": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "dto.MfaCredential": { + "type": "object", + "required": [ + "code", + "interval", + "secret" + ], + "properties": { + "code": { + "type": "string" + }, + "interval": { + "type": "string" + }, + "secret": { + "type": "string" + } + } + }, + "dto.MonitorSearch": { + "type": "object", + "required": [ + "param" + ], + "properties": { + "endTime": { + "type": "string" + }, + "info": { + "type": "string" + }, + "param": { + "type": "string", + "enum": [ + "all", + "cpu", + "memory", + "load", + "io", + "network" + ] + }, + "startTime": { + "type": "string" + } + } + }, + "dto.MysqlDBCreate": { + "type": "object", + "required": [ + "database", + "format", + "from", + "name", + "password", + "permission", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "description": { + "type": "string" + }, + "format": { + "type": "string", + "enum": [ + "utf8mb4", + "utf8", + "gbk", + "big5" + ] + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "permission": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "dto.MysqlDBDelete": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + } + } + }, + "dto.MysqlDBDeleteCheck": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + } + } + }, + "dto.MysqlDBSearch": { + "type": "object", + "required": [ + "database", + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "database": { + "type": "string" + }, + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.MysqlLoadDB": { + "type": "object", + "required": [ + "database", + "from", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + } + } + }, + "dto.MysqlOption": { + "type": "object", + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.MysqlStatus": { + "type": "object", + "properties": { + "Aborted_clients": { + "type": "string" + }, + "Aborted_connects": { + "type": "string" + }, + "Bytes_received": { + "type": "string" + }, + "Bytes_sent": { + "type": "string" + }, + "Com_commit": { + "type": "string" + }, + "Com_rollback": { + "type": "string" + }, + "Connections": { + "type": "string" + }, + "Created_tmp_disk_tables": { + "type": "string" + }, + "Created_tmp_tables": { + "type": "string" + }, + "File": { + "type": "string" + }, + "Innodb_buffer_pool_pages_dirty": { + "type": "string" + }, + "Innodb_buffer_pool_read_requests": { + "type": "string" + }, + "Innodb_buffer_pool_reads": { + "type": "string" + }, + "Key_read_requests": { + "type": "string" + }, + "Key_reads": { + "type": "string" + }, + "Key_write_requests": { + "type": "string" + }, + "Key_writes": { + "type": "string" + }, + "Max_used_connections": { + "type": "string" + }, + "Open_tables": { + "type": "string" + }, + "Opened_files": { + "type": "string" + }, + "Opened_tables": { + "type": "string" + }, + "Position": { + "type": "string" + }, + "Qcache_hits": { + "type": "string" + }, + "Qcache_inserts": { + "type": "string" + }, + "Questions": { + "type": "string" + }, + "Run": { + "type": "string" + }, + "Select_full_join": { + "type": "string" + }, + "Select_range_check": { + "type": "string" + }, + "Sort_merge_passes": { + "type": "string" + }, + "Table_locks_waited": { + "type": "string" + }, + "Threads_cached": { + "type": "string" + }, + "Threads_connected": { + "type": "string" + }, + "Threads_created": { + "type": "string" + }, + "Threads_running": { + "type": "string" + }, + "Uptime": { + "type": "string" + } + } + }, + "dto.MysqlVariables": { + "type": "object", + "properties": { + "binlog_cache_size": { + "type": "string" + }, + "innodb_buffer_pool_size": { + "type": "string" + }, + "innodb_log_buffer_size": { + "type": "string" + }, + "join_buffer_size": { + "type": "string" + }, + "key_buffer_size": { + "type": "string" + }, + "long_query_time": { + "type": "string" + }, + "max_connections": { + "type": "string" + }, + "max_heap_table_size": { + "type": "string" + }, + "query_cache_size": { + "type": "string" + }, + "query_cache_type": { + "type": "string" + }, + "read_buffer_size": { + "type": "string" + }, + "read_rnd_buffer_size": { + "type": "string" + }, + "slow_query_log": { + "type": "string" + }, + "sort_buffer_size": { + "type": "string" + }, + "table_open_cache": { + "type": "string" + }, + "thread_cache_size": { + "type": "string" + }, + "thread_stack": { + "type": "string" + }, + "tmp_table_size": { + "type": "string" + } + } + }, + "dto.MysqlVariablesUpdate": { + "type": "object", + "required": [ + "database", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "mysql", + "mariadb" + ] + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MysqlVariablesUpdateHelper" + } + } + } + }, + "dto.MysqlVariablesUpdateHelper": { + "type": "object", + "properties": { + "param": { + "type": "string" + }, + "value": {} + } + }, + "dto.NetworkCreate": { + "type": "object", + "required": [ + "driver", + "name" + ], + "properties": { + "auxAddress": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SettingUpdate" + } + }, + "auxAddressV6": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SettingUpdate" + } + }, + "driver": { + "type": "string" + }, + "gateway": { + "type": "string" + }, + "gatewayV6": { + "type": "string" + }, + "ipRange": { + "type": "string" + }, + "ipRangeV6": { + "type": "string" + }, + "ipv4": { + "type": "boolean" + }, + "ipv6": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string" + } + }, + "subnet": { + "type": "string" + }, + "subnetV6": { + "type": "string" + } + } + }, + "dto.NginxKey": { + "type": "string", + "enum": [ + "index", + "limit-conn", + "ssl", + "cache", + "http-per", + "proxy-cache" + ], + "x-enum-varnames": [ + "Index", + "LimitConn", + "SSL", + "CACHE", + "HttpPer", + "ProxyCache" + ] + }, + "dto.OneDriveInfo": { + "type": "object", + "properties": { + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + }, + "redirect_uri": { + "type": "string" + } + } + }, + "dto.Operate": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string" + } + } + }, + "dto.OperateByID": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "dto.OperationWithName": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + } + } + }, + "dto.OperationWithNameAndType": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.Options": { + "type": "object", + "properties": { + "option": { + "type": "string" + } + } + }, + "dto.OsInfo": { + "type": "object", + "properties": { + "diskSize": { + "type": "integer" + }, + "kernelArch": { + "type": "string" + }, + "kernelVersion": { + "type": "string" + }, + "os": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "platformFamily": { + "type": "string" + } + } + }, + "dto.PageContainer": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize", + "state" + ], + "properties": { + "excludeAppStore": { + "type": "boolean" + }, + "filters": { + "type": "string" + }, + "name": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "state", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "state": { + "type": "string", + "enum": [ + "all", + "created", + "running", + "paused", + "restarting", + "removing", + "exited", + "dead" + ] + } + } + }, + "dto.PageCronjob": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "status", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.PageInfo": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.PageResult": { + "type": "object", + "properties": { + "items": {}, + "total": { + "type": "integer" + } + } + }, + "dto.PasswordUpdate": { + "type": "object", + "required": [ + "newPassword", + "oldPassword" + ], + "properties": { + "newPassword": { + "type": "string" + }, + "oldPassword": { + "type": "string" + } + } + }, + "dto.PortHelper": { + "type": "object", + "properties": { + "containerPort": { + "type": "string" + }, + "hostIP": { + "type": "string" + }, + "hostPort": { + "type": "string" + }, + "protocol": { + "type": "string" + } + } + }, + "dto.PortRuleOperate": { + "type": "object", + "required": [ + "operation", + "port", + "protocol", + "strategy" + ], + "properties": { + "address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "port": { + "type": "string" + }, + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "tcp/udp" + ] + }, + "strategy": { + "type": "string", + "enum": [ + "accept", + "drop" + ] + } + } + }, + "dto.PortRuleUpdate": { + "type": "object", + "properties": { + "newRule": { + "$ref": "#/definitions/dto.PortRuleOperate" + }, + "oldRule": { + "$ref": "#/definitions/dto.PortRuleOperate" + } + } + }, + "dto.PortUpdate": { + "type": "object", + "required": [ + "serverPort" + ], + "properties": { + "serverPort": { + "type": "integer", + "maximum": 65535, + "minimum": 1 + } + } + }, + "dto.PostgresqlBindUser": { + "type": "object", + "required": [ + "database", + "name", + "password", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "superUser": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "dto.PostgresqlDBCreate": { + "type": "object", + "required": [ + "database", + "from", + "name", + "password", + "username" + ], + "properties": { + "database": { + "type": "string" + }, + "description": { + "type": "string" + }, + "format": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "superUser": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "dto.PostgresqlDBDelete": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "postgresql" + ] + } + } + }, + "dto.PostgresqlDBDeleteCheck": { + "type": "object", + "required": [ + "database", + "id", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "postgresql" + ] + } + } + }, + "dto.PostgresqlDBSearch": { + "type": "object", + "required": [ + "database", + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "database": { + "type": "string" + }, + "info": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "name", + "created_at" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.PostgresqlLoadDB": { + "type": "object", + "required": [ + "database", + "from", + "type" + ], + "properties": { + "database": { + "type": "string" + }, + "from": { + "type": "string", + "enum": [ + "local", + "remote" + ] + }, + "type": { + "type": "string", + "enum": [ + "postgresql" + ] + } + } + }, + "dto.ProxyUpdate": { + "type": "object", + "properties": { + "proxyPasswd": { + "type": "string" + }, + "proxyPasswdKeep": { + "type": "string" + }, + "proxyPort": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "proxyUrl": { + "type": "string" + }, + "proxyUser": { + "type": "string" + } + } + }, + "dto.RecordSearch": { + "type": "object", + "required": [ + "page", + "pageSize", + "type" + ], + "properties": { + "detailName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "dto.RecordSearchByCronjob": { + "type": "object", + "required": [ + "cronjobID", + "page", + "pageSize" + ], + "properties": { + "cronjobID": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.RedisCommand": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "dto.RedisConf": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "containerName": { + "type": "string" + }, + "database": { + "type": "string" + }, + "maxclients": { + "type": "string" + }, + "maxmemory": { + "type": "string" + }, + "name": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "requirepass": { + "type": "string" + }, + "timeout": { + "type": "string" + } + } + }, + "dto.RedisConfPersistenceUpdate": { + "type": "object", + "required": [ + "database", + "type" + ], + "properties": { + "appendfsync": { + "type": "string" + }, + "appendonly": { + "type": "string" + }, + "database": { + "type": "string" + }, + "save": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "aof", + "rbd" + ] + } + } + }, + "dto.RedisConfUpdate": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "database": { + "type": "string" + }, + "maxclients": { + "type": "string" + }, + "maxmemory": { + "type": "string" + }, + "timeout": { + "type": "string" + } + } + }, + "dto.RedisPersistence": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "appendfsync": { + "type": "string" + }, + "appendonly": { + "type": "string" + }, + "database": { + "type": "string" + }, + "save": { + "type": "string" + } + } + }, + "dto.RedisStatus": { + "type": "object", + "required": [ + "database" + ], + "properties": { + "connected_clients": { + "type": "string" + }, + "database": { + "type": "string" + }, + "instantaneous_ops_per_sec": { + "type": "string" + }, + "keyspace_hits": { + "type": "string" + }, + "keyspace_misses": { + "type": "string" + }, + "latest_fork_usec": { + "type": "string" + }, + "mem_fragmentation_ratio": { + "type": "string" + }, + "tcp_port": { + "type": "string" + }, + "total_commands_processed": { + "type": "string" + }, + "total_connections_received": { + "type": "string" + }, + "uptime_in_days": { + "type": "string" + }, + "used_memory": { + "type": "string" + }, + "used_memory_peak": { + "type": "string" + }, + "used_memory_rss": { + "type": "string" + } + } + }, + "dto.ResourceLimit": { + "type": "object", + "properties": { + "cpu": { + "type": "integer" + }, + "memory": { + "type": "integer" + } + } + }, + "dto.RuleSearch": { + "type": "object", + "required": [ + "page", + "pageSize", + "type" + ], + "properties": { + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "strategy": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.SSHConf": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + } + }, + "dto.SSHHistory": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "area": { + "type": "string" + }, + "authMode": { + "type": "string" + }, + "date": { + "type": "string" + }, + "dateStr": { + "type": "string" + }, + "message": { + "type": "string" + }, + "port": { + "type": "string" + }, + "status": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "dto.SSHInfo": { + "type": "object", + "properties": { + "autoStart": { + "type": "boolean" + }, + "listenAddress": { + "type": "string" + }, + "message": { + "type": "string" + }, + "passwordAuthentication": { + "type": "string" + }, + "permitRootLogin": { + "type": "string" + }, + "port": { + "type": "string" + }, + "pubkeyAuthentication": { + "type": "string" + }, + "status": { + "type": "string" + }, + "useDNS": { + "type": "string" + } + } + }, + "dto.SSHLog": { + "type": "object", + "properties": { + "failedCount": { + "type": "integer" + }, + "logs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SSHHistory" + } + }, + "successfulCount": { + "type": "integer" + }, + "totalCount": { + "type": "integer" + } + } + }, + "dto.SSHUpdate": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string" + }, + "newValue": { + "type": "string" + }, + "oldValue": { + "type": "string" + } + } + }, + "dto.SSLUpdate": { + "type": "object", + "required": [ + "ssl", + "sslType" + ], + "properties": { + "cert": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "key": { + "type": "string" + }, + "ssl": { + "type": "string", + "enum": [ + "enable", + "disable" + ] + }, + "sslID": { + "type": "integer" + }, + "sslType": { + "type": "string", + "enum": [ + "self", + "select", + "import", + "import-paste", + "import-local" + ] + } + } + }, + "dto.SearchForTree": { + "type": "object", + "properties": { + "info": { + "type": "string" + } + } + }, + "dto.SearchHostWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "groupID": { + "type": "integer" + }, + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.SearchLgLogWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "ip": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "dto.SearchOpLogWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "operation": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "source": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.SearchRecord": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "cronjobID": { + "type": "integer" + }, + "endTime": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "startTime": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.SearchSSHLog": { + "type": "object", + "required": [ + "Status", + "page", + "pageSize" + ], + "properties": { + "Status": { + "type": "string", + "enum": [ + "Success", + "Failed", + "All" + ] + }, + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.SearchWithPage": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "info": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dto.SettingInfo": { + "type": "object", + "properties": { + "allowIPs": { + "type": "string" + }, + "appStoreLastModified": { + "type": "string" + }, + "appStoreSyncStatus": { + "type": "string" + }, + "appStoreVersion": { + "type": "string" + }, + "bindAddress": { + "type": "string" + }, + "bindDomain": { + "type": "string" + }, + "complexityVerification": { + "type": "string" + }, + "defaultNetwork": { + "type": "string" + }, + "developerMode": { + "type": "string" + }, + "dingVars": { + "type": "string" + }, + "dockerSockPath": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVars": { + "type": "string" + }, + "expirationDays": { + "type": "string" + }, + "expirationTime": { + "type": "string" + }, + "fileRecycleBin": { + "type": "string" + }, + "ipv6": { + "type": "string" + }, + "language": { + "type": "string" + }, + "lastCleanData": { + "type": "string" + }, + "lastCleanSize": { + "type": "string" + }, + "lastCleanTime": { + "type": "string" + }, + "localTime": { + "type": "string" + }, + "menuTabs": { + "type": "string" + }, + "messageType": { + "type": "string" + }, + "mfaInterval": { + "type": "string" + }, + "mfaSecret": { + "type": "string" + }, + "mfaStatus": { + "type": "string" + }, + "monitorInterval": { + "type": "string" + }, + "monitorStatus": { + "type": "string" + }, + "monitorStoreDays": { + "type": "string" + }, + "noAuthSetting": { + "type": "string" + }, + "ntpSite": { + "type": "string" + }, + "panelName": { + "type": "string" + }, + "port": { + "type": "string" + }, + "proxyPasswd": { + "type": "string" + }, + "proxyPasswdKeep": { + "type": "string" + }, + "proxyPort": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "proxyUrl": { + "type": "string" + }, + "proxyUser": { + "type": "string" + }, + "securityEntrance": { + "type": "string" + }, + "serverPort": { + "type": "string" + }, + "sessionTimeout": { + "type": "string" + }, + "snapshotIgnore": { + "type": "string" + }, + "ssl": { + "type": "string" + }, + "sslType": { + "type": "string" + }, + "systemIP": { + "type": "string" + }, + "systemVersion": { + "type": "string" + }, + "theme": { + "type": "string" + }, + "timeZone": { + "type": "string" + }, + "userName": { + "type": "string" + }, + "weChatVars": { + "type": "string" + }, + "xpackHideMenu": { + "type": "string" + } + } + }, + "dto.SettingUpdate": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "dto.SnapshotBatchDelete": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "deleteWithFile": { + "type": "boolean" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.SnapshotCreate": { + "type": "object", + "required": [ + "defaultDownload", + "from" + ], + "properties": { + "defaultDownload": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "from": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "secret": { + "type": "string" + } + } + }, + "dto.SnapshotImport": { + "type": "object", + "properties": { + "description": { + "type": "string", + "maxLength": 256 + }, + "from": { + "type": "string" + }, + "names": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.SnapshotRecover": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "isNew": { + "type": "boolean" + }, + "reDownload": { + "type": "boolean" + }, + "secret": { + "type": "string" + } + } + }, + "dto.SwapHelper": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "isNew": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "used": { + "type": "string" + } + } + }, + "dto.TreeChild": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "label": { + "type": "string" + } + } + }, + "dto.UpdateByFile": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + } + }, + "dto.UpdateByNameAndFile": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "dto.UpdateDescription": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "description": { + "type": "string", + "maxLength": 256 + }, + "id": { + "type": "integer" + } + } + }, + "dto.UpdateFirewallDescription": { + "type": "object", + "required": [ + "strategy" + ], + "properties": { + "address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "port": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "strategy": { + "type": "string", + "enum": [ + "accept", + "drop" + ] + }, + "type": { + "type": "string" + } + } + }, + "dto.Upgrade": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string" + } + } + }, + "dto.UpgradeInfo": { + "type": "object", + "properties": { + "latestVersion": { + "type": "string" + }, + "newVersion": { + "type": "string" + }, + "releaseNote": { + "type": "string" + }, + "testVersion": { + "type": "string" + } + } + }, + "dto.UserLoginInfo": { + "type": "object", + "properties": { + "mfaStatus": { + "type": "string" + }, + "name": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "dto.VolumeCreate": { + "type": "object", + "required": [ + "driver", + "name" + ], + "properties": { + "driver": { + "type": "string" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.VolumeHelper": { + "type": "object", + "properties": { + "containerDir": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "sourceDir": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "files.FileInfo": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "favoriteID": { + "type": "integer" + }, + "gid": { + "type": "string" + }, + "group": { + "type": "string" + }, + "isDetail": { + "type": "boolean" + }, + "isDir": { + "type": "boolean" + }, + "isHidden": { + "type": "boolean" + }, + "isSymlink": { + "type": "boolean" + }, + "itemTotal": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/files.FileInfo" + } + }, + "linkPath": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "modTime": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "updateTime": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "mfa.Otp": { + "type": "object", + "properties": { + "qrImage": { + "type": "string" + }, + "secret": { + "type": "string" + } + } + }, + "model.App": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "crossVersionUpdate": { + "type": "boolean" + }, + "document": { + "type": "string" + }, + "github": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "lastModified": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "readMe": { + "type": "string" + }, + "recommend": { + "type": "integer" + }, + "required": { + "type": "string" + }, + "resource": { + "type": "string" + }, + "shortDescEn": { + "type": "string" + }, + "shortDescZh": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "model.AppInstall": { + "type": "object", + "properties": { + "app": { + "$ref": "#/definitions/model.App" + }, + "appDetailId": { + "type": "integer" + }, + "appId": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dockerCompose": { + "type": "string" + }, + "env": { + "type": "string" + }, + "httpPort": { + "type": "integer" + }, + "httpsPort": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "param": { + "type": "string" + }, + "serviceName": { + "type": "string" + }, + "status": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "model.Tag": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "sort": { + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + }, + "model.Website": { + "type": "object", + "properties": { + "IPV6": { + "type": "boolean" + }, + "accessLog": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "appInstallId": { + "type": "integer" + }, + "createdAt": { + "type": "string" + }, + "defaultServer": { + "type": "boolean" + }, + "domains": { + "type": "array", + "items": { + "$ref": "#/definitions/model.WebsiteDomain" + } + }, + "errorLog": { + "type": "boolean" + }, + "expireDate": { + "type": "string" + }, + "ftpId": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "httpConfig": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "rewrite": { + "type": "string" + }, + "runtimeID": { + "type": "integer" + }, + "siteDir": { + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "user": { + "type": "string" + }, + "webSiteGroupId": { + "type": "integer" + }, + "webSiteSSL": { + "$ref": "#/definitions/model.WebsiteSSL" + }, + "webSiteSSLId": { + "type": "integer" + } + } + }, + "model.WebsiteAcmeAccount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "eabHmacKey": { + "type": "string" + }, + "eabKid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "model.WebsiteDnsAccount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "model.WebsiteDomain": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "updatedAt": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "model.WebsiteSSL": { + "type": "object", + "properties": { + "acmeAccount": { + "$ref": "#/definitions/model.WebsiteAcmeAccount" + }, + "acmeAccountId": { + "type": "integer" + }, + "autoRenew": { + "type": "boolean" + }, + "caId": { + "type": "integer" + }, + "certURL": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "disableCNAME": { + "type": "boolean" + }, + "dnsAccount": { + "$ref": "#/definitions/model.WebsiteDnsAccount" + }, + "dnsAccountId": { + "type": "integer" + }, + "domains": { + "type": "string" + }, + "execShell": { + "type": "boolean" + }, + "expireDate": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "message": { + "type": "string" + }, + "nameserver1": { + "type": "string" + }, + "nameserver2": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "pem": { + "type": "string" + }, + "primaryDomain": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "pushDir": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "skipDNS": { + "type": "boolean" + }, + "startDate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "websites": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Website" + } + } + } + }, + "request.AppInstallCreate": { + "type": "object", + "required": [ + "appDetailId", + "name" + ], + "properties": { + "advanced": { + "type": "boolean" + }, + "allowPort": { + "type": "boolean" + }, + "appDetailId": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "cpuQuota": { + "type": "number" + }, + "dockerCompose": { + "type": "string" + }, + "editCompose": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "memoryLimit": { + "type": "number" + }, + "memoryUnit": { + "type": "string" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "pullImage": { + "type": "boolean" + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "request.AppInstalledIgnoreUpgrade": { + "type": "object", + "required": [ + "detailID", + "operate" + ], + "properties": { + "detailID": { + "type": "integer" + }, + "operate": { + "type": "string", + "enum": [ + "cancel", + "ignore" + ] + } + } + }, + "request.AppInstalledInfo": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "request.AppInstalledOperate": { + "type": "object", + "required": [ + "installId", + "operate" + ], + "properties": { + "backup": { + "type": "boolean" + }, + "backupId": { + "type": "integer" + }, + "deleteBackup": { + "type": "boolean" + }, + "deleteDB": { + "type": "boolean" + }, + "detailId": { + "type": "integer" + }, + "dockerCompose": { + "type": "string" + }, + "forceDelete": { + "type": "boolean" + }, + "installId": { + "type": "integer" + }, + "operate": { + "type": "string" + }, + "pullImage": { + "type": "boolean" + } + } + }, + "request.AppInstalledSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "all": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "sync": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + }, + "unused": { + "type": "boolean" + }, + "update": { + "type": "boolean" + } + } + }, + "request.AppInstalledUpdate": { + "type": "object", + "required": [ + "installId", + "params" + ], + "properties": { + "advanced": { + "type": "boolean" + }, + "allowPort": { + "type": "boolean" + }, + "containerName": { + "type": "string" + }, + "cpuQuota": { + "type": "number" + }, + "dockerCompose": { + "type": "string" + }, + "editCompose": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "installId": { + "type": "integer" + }, + "memoryLimit": { + "type": "number" + }, + "memoryUnit": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "pullImage": { + "type": "boolean" + } + } + }, + "request.AppSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "recommend": { + "type": "boolean" + }, + "resource": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "request.DirSizeReq": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "request.ExposedPort": { + "type": "object", + "properties": { + "containerPort": { + "type": "integer" + }, + "hostPort": { + "type": "integer" + } + } + }, + "request.FavoriteCreate": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "request.FavoriteDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.FileBatchDelete": { + "type": "object", + "required": [ + "paths" + ], + "properties": { + "isDir": { + "type": "boolean" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "request.FileCompress": { + "type": "object", + "required": [ + "dst", + "files", + "name", + "type" + ], + "properties": { + "dst": { + "type": "string" + }, + "files": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "replace": { + "type": "boolean" + }, + "secret": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.FileContentReq": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "isDetail": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "request.FileCreate": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "content": { + "type": "string" + }, + "isDir": { + "type": "boolean" + }, + "isLink": { + "type": "boolean" + }, + "isSymlink": { + "type": "boolean" + }, + "linkPath": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "sub": { + "type": "boolean" + } + } + }, + "request.FileDeCompress": { + "type": "object", + "required": [ + "dst", + "path", + "type" + ], + "properties": { + "dst": { + "type": "string" + }, + "path": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.FileDelete": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "forceDelete": { + "type": "boolean" + }, + "isDir": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "request.FileDownload": { + "type": "object", + "required": [ + "name", + "paths", + "type" + ], + "properties": { + "compress": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "request.FileEdit": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "content": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "request.FileMove": { + "type": "object", + "required": [ + "newPath", + "oldPaths", + "type" + ], + "properties": { + "cover": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "newPath": { + "type": "string" + }, + "oldPaths": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "request.FileOption": { + "type": "object", + "properties": { + "containSub": { + "type": "boolean" + }, + "dir": { + "type": "boolean" + }, + "expand": { + "type": "boolean" + }, + "isDetail": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "search": { + "type": "string" + }, + "showHidden": { + "type": "boolean" + }, + "sortBy": { + "type": "string" + }, + "sortOrder": { + "type": "string" + } + } + }, + "request.FilePathCheck": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string" + } + } + }, + "request.FileReadByLineReq": { + "type": "object", + "required": [ + "page", + "pageSize", + "type" + ], + "properties": { + "ID": { + "type": "integer" + }, + "latest": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "request.FileRename": { + "type": "object", + "required": [ + "newName", + "oldName" + ], + "properties": { + "newName": { + "type": "string" + }, + "oldName": { + "type": "string" + } + } + }, + "request.FileRoleReq": { + "type": "object", + "required": [ + "group", + "mode", + "paths", + "user" + ], + "properties": { + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "sub": { + "type": "boolean" + }, + "user": { + "type": "string" + } + } + }, + "request.FileRoleUpdate": { + "type": "object", + "required": [ + "group", + "path", + "user" + ], + "properties": { + "group": { + "type": "string" + }, + "path": { + "type": "string" + }, + "sub": { + "type": "boolean" + }, + "user": { + "type": "string" + } + } + }, + "request.FileWget": { + "type": "object", + "required": [ + "name", + "path", + "url" + ], + "properties": { + "ignoreCertificate": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "request.HostToolConfig": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "operate": { + "type": "string", + "enum": [ + "get", + "set" + ] + }, + "type": { + "type": "string", + "enum": [ + "supervisord" + ] + } + } + }, + "request.HostToolCreate": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "configPath": { + "type": "string" + }, + "serviceName": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.HostToolLogReq": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "supervisord" + ] + } + } + }, + "request.HostToolReq": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "operate": { + "type": "string", + "enum": [ + "status", + "restart", + "start", + "stop" + ] + }, + "type": { + "type": "string", + "enum": [ + "supervisord" + ] + } + } + }, + "request.NewAppInstall": { + "type": "object", + "properties": { + "advanced": { + "type": "boolean" + }, + "allowPort": { + "type": "boolean" + }, + "appDetailID": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "cpuQuota": { + "type": "number" + }, + "dockerCompose": { + "type": "string" + }, + "editCompose": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "memoryLimit": { + "type": "number" + }, + "memoryUnit": { + "type": "string" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "pullImage": { + "type": "boolean" + } + } + }, + "request.NginxAntiLeechUpdate": { + "type": "object", + "required": [ + "extends", + "return", + "websiteID" + ], + "properties": { + "blocked": { + "type": "boolean" + }, + "cache": { + "type": "boolean" + }, + "cacheTime": { + "type": "integer" + }, + "cacheUint": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "extends": { + "type": "string" + }, + "logEnable": { + "type": "boolean" + }, + "noneRef": { + "type": "boolean" + }, + "return": { + "type": "string" + }, + "serverNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxAuthReq": { + "type": "object", + "required": [ + "websiteID" + ], + "properties": { + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxAuthUpdate": { + "type": "object", + "required": [ + "operate", + "websiteID" + ], + "properties": { + "operate": { + "type": "string" + }, + "password": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "username": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxCommonReq": { + "type": "object", + "required": [ + "websiteID" + ], + "properties": { + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxConfigFileUpdate": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "backup": { + "type": "boolean" + }, + "content": { + "type": "string" + } + } + }, + "request.NginxConfigUpdate": { + "type": "object", + "required": [ + "operate" + ], + "properties": { + "operate": { + "type": "string", + "enum": [ + "add", + "update", + "delete" + ] + }, + "params": {}, + "scope": { + "$ref": "#/definitions/dto.NginxKey" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxProxyUpdate": { + "type": "object", + "required": [ + "content", + "name", + "websiteID" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxRedirectReq": { + "type": "object", + "required": [ + "name", + "operate", + "redirect", + "target", + "type", + "websiteID" + ], + "properties": { + "domains": { + "type": "array", + "items": { + "type": "string" + } + }, + "enable": { + "type": "boolean" + }, + "keepPath": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "path": { + "type": "string" + }, + "redirect": { + "type": "string" + }, + "redirectRoot": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "type": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxRedirectUpdate": { + "type": "object", + "required": [ + "content", + "name", + "websiteID" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.NginxRewriteReq": { + "type": "object", + "required": [ + "name", + "websiteId" + ], + "properties": { + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxRewriteUpdate": { + "type": "object", + "required": [ + "name", + "websiteId" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxScopeReq": { + "type": "object", + "required": [ + "scope" + ], + "properties": { + "scope": { + "$ref": "#/definitions/dto.NginxKey" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NodeModuleReq": { + "type": "object", + "required": [ + "ID" + ], + "properties": { + "ID": { + "type": "integer" + } + } + }, + "request.NodePackageReq": { + "type": "object", + "properties": { + "codeDir": { + "type": "string" + } + } + }, + "request.PHPExtensionsCreate": { + "type": "object", + "required": [ + "extensions", + "name" + ], + "properties": { + "extensions": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "request.PHPExtensionsDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.PHPExtensionsSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "all": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.PHPExtensionsUpdate": { + "type": "object", + "required": [ + "extensions", + "id" + ], + "properties": { + "extensions": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "request.PortUpdate": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "port": { + "type": "integer" + } + } + }, + "request.ProcessReq": { + "type": "object", + "required": [ + "PID" + ], + "properties": { + "PID": { + "type": "integer" + } + } + }, + "request.RecycleBinReduce": { + "type": "object", + "required": [ + "from", + "rName" + ], + "properties": { + "from": { + "type": "string" + }, + "name": { + "type": "string" + }, + "rName": { + "type": "string" + } + } + }, + "request.RuntimeCreate": { + "type": "object", + "properties": { + "appDetailId": { + "type": "integer" + }, + "clean": { + "type": "boolean" + }, + "codeDir": { + "type": "string" + }, + "exposedPorts": { + "type": "array", + "items": { + "$ref": "#/definitions/request.ExposedPort" + } + }, + "image": { + "type": "string" + }, + "install": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "port": { + "type": "integer" + }, + "resource": { + "type": "string" + }, + "source": { + "type": "string" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "request.RuntimeDelete": { + "type": "object", + "properties": { + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + } + }, + "request.RuntimeOperate": { + "type": "object", + "properties": { + "ID": { + "type": "integer" + }, + "operate": { + "type": "string" + } + } + }, + "request.RuntimeSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.RuntimeUpdate": { + "type": "object", + "properties": { + "clean": { + "type": "boolean" + }, + "codeDir": { + "type": "string" + }, + "exposedPorts": { + "type": "array", + "items": { + "$ref": "#/definitions/request.ExposedPort" + } + }, + "id": { + "type": "integer" + }, + "image": { + "type": "string" + }, + "install": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "params": { + "type": "object", + "additionalProperties": true + }, + "port": { + "type": "integer" + }, + "rebuild": { + "type": "boolean" + }, + "source": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "request.SearchUploadWithPage": { + "type": "object", + "required": [ + "page", + "pageSize", + "path" + ], + "properties": { + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "path": { + "type": "string" + } + } + }, + "request.SupervisorProcessConfig": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "name": { + "type": "string" + }, + "numprocs": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "request.SupervisorProcessFileReq": { + "type": "object", + "required": [ + "file", + "name", + "operate" + ], + "properties": { + "content": { + "type": "string" + }, + "file": { + "type": "string", + "enum": [ + "out.log", + "err.log", + "config" + ] + }, + "name": { + "type": "string" + }, + "operate": { + "type": "string", + "enum": [ + "get", + "clear", + "update" + ] + } + } + }, + "request.WebsiteAcmeAccountCreate": { + "type": "object", + "required": [ + "email", + "keyType", + "type" + ], + "properties": { + "eabHmacKey": { + "type": "string" + }, + "eabKid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "keyType": { + "type": "string", + "enum": [ + "P256", + "P384", + "2048", + "3072", + "4096", + "8192" + ] + }, + "type": { + "type": "string", + "enum": [ + "letsencrypt", + "zerossl", + "buypass", + "google" + ] + } + } + }, + "request.WebsiteBatchDelReq": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "request.WebsiteCACreate": { + "type": "object", + "required": [ + "commonName", + "country", + "keyType", + "name", + "organization" + ], + "properties": { + "city": { + "type": "string" + }, + "commonName": { + "type": "string" + }, + "country": { + "type": "string" + }, + "keyType": { + "type": "string", + "enum": [ + "P256", + "P384", + "2048", + "3072", + "4096", + "8192" + ] + }, + "name": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "organizationUint": { + "type": "string" + }, + "province": { + "type": "string" + } + } + }, + "request.WebsiteCAObtain": { + "type": "object", + "required": [ + "domains", + "id", + "keyType", + "time", + "unit" + ], + "properties": { + "autoRenew": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "domains": { + "type": "string" + }, + "execShell": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string", + "enum": [ + "P256", + "P384", + "2048", + "3072", + "4096", + "8192" + ] + }, + "pushDir": { + "type": "boolean" + }, + "renew": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "sslID": { + "type": "integer" + }, + "time": { + "type": "integer" + }, + "unit": { + "type": "string" + } + } + }, + "request.WebsiteCASearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.WebsiteCommonReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteCreate": { + "type": "object", + "required": [ + "alias", + "primaryDomain", + "type", + "webSiteGroupID" + ], + "properties": { + "IPV6": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "appID": { + "type": "integer" + }, + "appInstall": { + "$ref": "#/definitions/request.NewAppInstall" + }, + "appInstallID": { + "type": "integer" + }, + "appType": { + "type": "string", + "enum": [ + "new", + "installed" + ] + }, + "ftpPassword": { + "type": "string" + }, + "ftpUser": { + "type": "string" + }, + "otherDomains": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "runtimeID": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "webSiteGroupID": { + "type": "integer" + } + } + }, + "request.WebsiteDNSReq": { + "type": "object", + "required": [ + "acmeAccountId", + "domains" + ], + "properties": { + "acmeAccountId": { + "type": "integer" + }, + "domains": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "request.WebsiteDefaultUpdate": { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "deleteApp": { + "type": "boolean" + }, + "deleteBackup": { + "type": "boolean" + }, + "forceDelete": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + } + }, + "request.WebsiteDnsAccountCreate": { + "type": "object", + "required": [ + "authorization", + "name", + "type" + ], + "properties": { + "authorization": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsiteDnsAccountUpdate": { + "type": "object", + "required": [ + "authorization", + "id", + "name", + "type" + ], + "properties": { + "authorization": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsiteDomainCreate": { + "type": "object", + "required": [ + "domains", + "websiteID" + ], + "properties": { + "domains": { + "type": "string" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.WebsiteDomainDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteHTTPSOp": { + "type": "object", + "required": [ + "websiteId" + ], + "properties": { + "SSLProtocol": { + "type": "array", + "items": { + "type": "string" + } + }, + "algorithm": { + "type": "string" + }, + "certificate": { + "type": "string" + }, + "certificatePath": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "hsts": { + "type": "boolean" + }, + "httpConfig": { + "type": "string", + "enum": [ + "HTTPSOnly", + "HTTPAlso", + "HTTPToHTTPS" + ] + }, + "importType": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPath": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "existed", + "auto", + "manual" + ] + }, + "websiteId": { + "type": "integer" + }, + "websiteSSLId": { + "type": "integer" + } + } + }, + "request.WebsiteHtmlUpdate": { + "type": "object", + "required": [ + "content", + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsiteInstallCheckReq": { + "type": "object", + "properties": { + "InstallIds": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "request.WebsiteLogReq": { + "type": "object", + "required": [ + "id", + "logType", + "operate" + ], + "properties": { + "id": { + "type": "integer" + }, + "logType": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.WebsiteNginxUpdate": { + "type": "object", + "required": [ + "content", + "id" + ], + "properties": { + "content": { + "type": "string" + }, + "id": { + "type": "integer" + } + } + }, + "request.WebsiteOp": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "operate": { + "type": "string" + } + } + }, + "request.WebsitePHPConfigUpdate": { + "type": "object", + "required": [ + "id", + "scope" + ], + "properties": { + "disableFunctions": { + "type": "array", + "items": { + "type": "string" + } + }, + "id": { + "type": "integer" + }, + "params": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "scope": { + "type": "string" + }, + "uploadMaxSize": { + "type": "string" + } + } + }, + "request.WebsitePHPFileUpdate": { + "type": "object", + "required": [ + "content", + "id", + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, + "request.WebsitePHPVersionReq": { + "type": "object", + "required": [ + "runtimeID", + "websiteID" + ], + "properties": { + "retainConfig": { + "type": "boolean" + }, + "runtimeID": { + "type": "integer" + }, + "websiteID": { + "type": "integer" + } + } + }, + "request.WebsiteProxyConfig": { + "type": "object", + "required": [ + "id", + "match", + "name", + "operate", + "proxyHost", + "proxyPass" + ], + "properties": { + "cache": { + "type": "boolean" + }, + "cacheTime": { + "type": "integer" + }, + "cacheUnit": { + "type": "string" + }, + "content": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "filePath": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "match": { + "type": "string" + }, + "modifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "operate": { + "type": "string" + }, + "proxyHost": { + "type": "string" + }, + "proxyPass": { + "type": "string" + }, + "replaces": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "sni": { + "type": "boolean" + } + } + }, + "request.WebsiteProxyReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteResourceReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + }, + "request.WebsiteSSLApply": { + "type": "object", + "required": [ + "ID" + ], + "properties": { + "ID": { + "type": "integer" + }, + "nameservers": { + "type": "array", + "items": { + "type": "string" + } + }, + "skipDNSCheck": { + "type": "boolean" + } + } + }, + "request.WebsiteSSLCreate": { + "type": "object", + "required": [ + "acmeAccountId", + "primaryDomain", + "provider" + ], + "properties": { + "acmeAccountId": { + "type": "integer" + }, + "apply": { + "type": "boolean" + }, + "autoRenew": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "disableCNAME": { + "type": "boolean" + }, + "dnsAccountId": { + "type": "integer" + }, + "execShell": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "nameserver1": { + "type": "string" + }, + "nameserver2": { + "type": "string" + }, + "otherDomains": { + "type": "string" + }, + "primaryDomain": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "pushDir": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "skipDNS": { + "type": "boolean" + } + } + }, + "request.WebsiteSSLSearch": { + "type": "object", + "required": [ + "page", + "pageSize" + ], + "properties": { + "acmeAccountID": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "request.WebsiteSSLUpdate": { + "type": "object", + "required": [ + "id", + "primaryDomain", + "provider" + ], + "properties": { + "acmeAccountId": { + "type": "integer" + }, + "apply": { + "type": "boolean" + }, + "autoRenew": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "dir": { + "type": "string" + }, + "disableCNAME": { + "type": "boolean" + }, + "dnsAccountId": { + "type": "integer" + }, + "execShell": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "nameserver1": { + "type": "string" + }, + "nameserver2": { + "type": "string" + }, + "otherDomains": { + "type": "string" + }, + "primaryDomain": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "pushDir": { + "type": "boolean" + }, + "shell": { + "type": "string" + }, + "skipDNS": { + "type": "boolean" + } + } + }, + "request.WebsiteSSLUpload": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "certificate": { + "type": "string" + }, + "certificatePath": { + "type": "string" + }, + "description": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPath": { + "type": "string" + }, + "sslID": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "paste", + "local" + ] + } + } + }, + "request.WebsiteSearch": { + "type": "object", + "required": [ + "order", + "orderBy", + "page", + "pageSize" + ], + "properties": { + "name": { + "type": "string" + }, + "order": { + "type": "string", + "enum": [ + "null", + "ascending", + "descending" + ] + }, + "orderBy": { + "type": "string", + "enum": [ + "primary_domain", + "type", + "status", + "created_at", + "expire_date" + ] + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "websiteGroupId": { + "type": "integer" + } + } + }, + "request.WebsiteUpdate": { + "type": "object", + "required": [ + "id", + "primaryDomain" + ], + "properties": { + "IPV6": { + "type": "boolean" + }, + "expireDate": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "webSiteGroupID": { + "type": "integer" + } + } + }, + "request.WebsiteUpdateDir": { + "type": "object", + "required": [ + "id", + "siteDir" + ], + "properties": { + "id": { + "type": "integer" + }, + "siteDir": { + "type": "string" + } + } + }, + "request.WebsiteUpdateDirPermission": { + "type": "object", + "required": [ + "group", + "id", + "user" + ], + "properties": { + "group": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "user": { + "type": "string" + } + } + }, + "response.AppDTO": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "crossVersionUpdate": { + "type": "boolean" + }, + "document": { + "type": "string" + }, + "github": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "installed": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "lastModified": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "readMe": { + "type": "string" + }, + "recommend": { + "type": "integer" + }, + "required": { + "type": "string" + }, + "resource": { + "type": "string" + }, + "shortDescEn": { + "type": "string" + }, + "shortDescZh": { + "type": "string" + }, + "status": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Tag" + } + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "versions": { + "type": "array", + "items": { + "type": "string" + } + }, + "website": { + "type": "string" + } + } + }, + "response.AppDetailDTO": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "createdAt": { + "type": "string" + }, + "dockerCompose": { + "type": "string" + }, + "downloadCallBackUrl": { + "type": "string" + }, + "downloadUrl": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "hostMode": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "ignoreUpgrade": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "lastModified": { + "type": "integer" + }, + "lastVersion": { + "type": "string" + }, + "params": {}, + "status": { + "type": "string" + }, + "update": { + "type": "boolean" + }, + "updatedAt": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "response.AppInstalledCheck": { + "type": "object", + "properties": { + "app": { + "type": "string" + }, + "appInstallId": { + "type": "integer" + }, + "containerName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "httpPort": { + "type": "integer" + }, + "httpsPort": { + "type": "integer" + }, + "installPath": { + "type": "string" + }, + "isExist": { + "type": "boolean" + }, + "lastBackupAt": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "response.AppParam": { + "type": "object", + "properties": { + "edit": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "labelEn": { + "type": "string" + }, + "labelZh": { + "type": "string" + }, + "multiple": { + "type": "boolean" + }, + "required": { + "type": "boolean" + }, + "rule": { + "type": "string" + }, + "showValue": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": {}, + "values": {} + } + }, + "response.AppService": { + "type": "object", + "properties": { + "config": {}, + "from": { + "type": "string" + }, + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "response.FileInfo": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "favoriteID": { + "type": "integer" + }, + "gid": { + "type": "string" + }, + "group": { + "type": "string" + }, + "isDetail": { + "type": "boolean" + }, + "isDir": { + "type": "boolean" + }, + "isHidden": { + "type": "boolean" + }, + "isSymlink": { + "type": "boolean" + }, + "itemTotal": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/files.FileInfo" + } + }, + "linkPath": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "modTime": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "updateTime": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "response.FileTree": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/response.FileTree" + } + }, + "extension": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isDir": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "response.IgnoredApp": { + "type": "object", + "properties": { + "detailID": { + "type": "integer" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "response.NginxParam": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "params": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "response.NginxStatus": { + "type": "object", + "properties": { + "accepts": { + "type": "string" + }, + "active": { + "type": "string" + }, + "handled": { + "type": "string" + }, + "reading": { + "type": "string" + }, + "requests": { + "type": "string" + }, + "waiting": { + "type": "string" + }, + "writing": { + "type": "string" + } + } + }, + "response.PHPConfig": { + "type": "object", + "properties": { + "disableFunctions": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "uploadMaxSize": { + "type": "string" + } + } + }, + "response.PHPExtensionsDTO": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "extensions": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "response.WebsiteAcmeAccountDTO": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "eabHmacKey": { + "type": "string" + }, + "eabKid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "response.WebsiteCADTO": { + "type": "object", + "properties": { + "city": { + "type": "string" + }, + "commonName": { + "type": "string" + }, + "country": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "csr": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keyType": { + "type": "string" + }, + "name": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "organizationUint": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "province": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "response.WebsiteDNSRes": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "err": { + "type": "string" + }, + "resolve": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "response.WebsiteDTO": { + "type": "object", + "properties": { + "IPV6": { + "type": "boolean" + }, + "accessLog": { + "type": "boolean" + }, + "accessLogPath": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "appInstallId": { + "type": "integer" + }, + "appName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "defaultServer": { + "type": "boolean" + }, + "domains": { + "type": "array", + "items": { + "$ref": "#/definitions/model.WebsiteDomain" + } + }, + "errorLog": { + "type": "boolean" + }, + "errorLogPath": { + "type": "string" + }, + "expireDate": { + "type": "string" + }, + "ftpId": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "httpConfig": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "primaryDomain": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "proxyType": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "rewrite": { + "type": "string" + }, + "runtimeID": { + "type": "integer" + }, + "runtimeName": { + "type": "string" + }, + "siteDir": { + "type": "string" + }, + "sitePath": { + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "user": { + "type": "string" + }, + "webSiteGroupId": { + "type": "integer" + }, + "webSiteSSL": { + "$ref": "#/definitions/model.WebsiteSSL" + }, + "webSiteSSLId": { + "type": "integer" + } + } + }, + "response.WebsiteHTTPS": { + "type": "object", + "properties": { + "SSL": { + "$ref": "#/definitions/model.WebsiteSSL" + }, + "SSLProtocol": { + "type": "array", + "items": { + "type": "string" + } + }, + "algorithm": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "hsts": { + "type": "boolean" + }, + "httpConfig": { + "type": "string" + } + } + }, + "response.WebsiteLog": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "end": { + "type": "boolean" + }, + "path": { + "type": "string" + } + } + }, + "response.WebsiteNginxConfig": { + "type": "object", + "properties": { + "enable": { + "type": "boolean" + }, + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/response.NginxParam" + } + } + } + }, + "response.WebsitePreInstallCheck": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/core/cmd/server/docs/swagger.yaml b/core/cmd/server/docs/swagger.yaml new file mode 100644 index 000000000..9dabd1965 --- /dev/null +++ b/core/cmd/server/docs/swagger.yaml @@ -0,0 +1,15166 @@ +basePath: /api/v1 +definitions: + dto.AddrRuleOperate: + properties: + address: + type: string + description: + type: string + operation: + enum: + - add + - remove + type: string + strategy: + enum: + - accept + - drop + type: string + required: + - address + - operation + - strategy + type: object + dto.AddrRuleUpdate: + properties: + newRule: + $ref: '#/definitions/dto.AddrRuleOperate' + oldRule: + $ref: '#/definitions/dto.AddrRuleOperate' + type: object + dto.AppInstallInfo: + properties: + id: + type: integer + key: + type: string + name: + type: string + type: object + dto.AppResource: + properties: + name: + type: string + type: + type: string + type: object + dto.AppVersion: + properties: + detailId: + type: integer + dockerCompose: + type: string + version: + type: string + type: object + dto.BackupInfo: + properties: + backupPath: + type: string + bucket: + type: string + createdAt: + type: string + id: + type: integer + type: + type: string + vars: + type: string + type: object + dto.BackupOperate: + properties: + accessKey: + type: string + backupPath: + type: string + bucket: + type: string + credential: + type: string + id: + type: integer + type: + type: string + vars: + type: string + required: + - type + - vars + type: object + dto.BackupSearchFile: + properties: + type: + type: string + required: + - type + type: object + dto.BatchDelete: + properties: + force: + type: boolean + names: + items: + type: string + type: array + required: + - names + type: object + dto.BatchDeleteReq: + properties: + ids: + items: + type: integer + type: array + required: + - ids + type: object + dto.BatchRuleOperate: + properties: + rules: + items: + $ref: '#/definitions/dto.PortRuleOperate' + type: array + type: + type: string + required: + - type + type: object + dto.BindInfo: + properties: + bindAddress: + type: string + ipv6: + enum: + - enable + - disable + type: string + required: + - bindAddress + - ipv6 + type: object + dto.BindUser: + properties: + database: + type: string + db: + type: string + password: + type: string + permission: + type: string + username: + type: string + required: + - database + - db + - password + - permission + - username + type: object + dto.CaptchaResponse: + properties: + captchaID: + type: string + imagePath: + type: string + type: object + dto.ChangeDBInfo: + properties: + database: + type: string + from: + enum: + - local + - remote + type: string + id: + type: integer + type: + enum: + - mysql + - mariadb + - postgresql + type: string + value: + type: string + required: + - database + - from + - type + - value + type: object + dto.ChangeHostGroup: + properties: + groupID: + type: integer + id: + type: integer + required: + - groupID + - id + type: object + dto.ChangePasswd: + properties: + passwd: + type: string + user: + type: string + type: object + dto.ChangeRedisPass: + properties: + database: + type: string + value: + type: string + required: + - database + type: object + dto.ClamBaseInfo: + properties: + freshIsActive: + type: boolean + freshIsExist: + type: boolean + freshVersion: + type: string + isActive: + type: boolean + isExist: + type: boolean + version: + type: string + type: object + dto.ClamCreate: + properties: + description: + type: string + infectedDir: + type: string + infectedStrategy: + type: string + name: + type: string + path: + type: string + spec: + type: string + status: + type: string + type: object + dto.ClamDelete: + properties: + ids: + items: + type: integer + type: array + removeInfected: + type: boolean + removeRecord: + type: boolean + required: + - ids + type: object + dto.ClamFileReq: + properties: + name: + type: string + tail: + type: string + required: + - name + type: object + dto.ClamLogReq: + properties: + clamName: + type: string + recordName: + type: string + tail: + type: string + type: object + dto.ClamLogSearch: + properties: + clamID: + type: integer + endTime: + type: string + page: + type: integer + pageSize: + type: integer + startTime: + type: string + required: + - page + - pageSize + type: object + dto.ClamUpdate: + properties: + description: + type: string + id: + type: integer + infectedDir: + type: string + infectedStrategy: + type: string + name: + type: string + path: + type: string + spec: + type: string + type: object + dto.ClamUpdateStatus: + properties: + id: + type: integer + status: + type: string + type: object + dto.Clean: + properties: + name: + type: string + size: + type: integer + treeType: + type: string + type: object + dto.CleanLog: + properties: + logType: + enum: + - login + - operation + type: string + required: + - logType + type: object + dto.CommandInfo: + properties: + command: + type: string + groupBelong: + type: string + groupID: + type: integer + id: + type: integer + name: + type: string + type: object + dto.CommandOperate: + properties: + command: + type: string + groupBelong: + type: string + groupID: + type: integer + id: + type: integer + name: + type: string + required: + - command + - name + type: object + dto.CommonBackup: + properties: + detailName: + type: string + name: + type: string + secret: + type: string + type: + enum: + - app + - mysql + - mariadb + - redis + - website + - postgresql + type: string + required: + - type + type: object + dto.CommonRecover: + properties: + detailName: + type: string + file: + type: string + name: + type: string + secret: + type: string + source: + enum: + - OSS + - S3 + - SFTP + - MINIO + - LOCAL + - COS + - KODO + - OneDrive + - WebDAV + type: string + type: + enum: + - app + - mysql + - mariadb + - redis + - website + - postgresql + type: string + required: + - source + - type + type: object + dto.ComposeCreate: + properties: + file: + type: string + from: + enum: + - edit + - path + - template + type: string + name: + type: string + path: + type: string + template: + type: integer + required: + - from + type: object + dto.ComposeOperation: + properties: + name: + type: string + operation: + enum: + - start + - stop + - down + type: string + path: + type: string + withFile: + type: boolean + required: + - name + - operation + - path + type: object + dto.ComposeTemplateCreate: + properties: + content: + type: string + description: + type: string + name: + type: string + required: + - name + type: object + dto.ComposeTemplateInfo: + properties: + content: + type: string + createdAt: + type: string + description: + type: string + id: + type: integer + name: + type: string + type: object + dto.ComposeTemplateUpdate: + properties: + content: + type: string + description: + type: string + id: + type: integer + type: object + dto.ComposeUpdate: + properties: + content: + type: string + name: + type: string + path: + type: string + required: + - content + - name + - path + type: object + dto.ContainerCommit: + properties: + author: + type: string + comment: + type: string + containerID: + type: string + containerName: + type: string + newImageName: + type: string + pause: + type: boolean + required: + - containerID + type: object + dto.ContainerListStats: + properties: + containerID: + type: string + cpuPercent: + type: number + cpuTotalUsage: + type: integer + memoryCache: + type: integer + memoryLimit: + type: integer + memoryPercent: + type: number + memoryUsage: + type: integer + percpuUsage: + type: integer + systemUsage: + type: integer + type: object + dto.ContainerOperate: + properties: + autoRemove: + type: boolean + cmd: + items: + type: string + type: array + containerID: + type: string + cpuShares: + type: integer + entrypoint: + items: + type: string + type: array + env: + items: + type: string + type: array + exposedPorts: + items: + $ref: '#/definitions/dto.PortHelper' + type: array + forcePull: + type: boolean + image: + type: string + ipv4: + type: string + ipv6: + type: string + labels: + items: + type: string + type: array + memory: + type: number + name: + type: string + nanoCPUs: + type: number + network: + type: string + openStdin: + type: boolean + privileged: + type: boolean + publishAllPorts: + type: boolean + restartPolicy: + type: string + tty: + type: boolean + volumes: + items: + $ref: '#/definitions/dto.VolumeHelper' + type: array + required: + - image + - name + type: object + dto.ContainerOperation: + properties: + names: + items: + type: string + type: array + operation: + enum: + - start + - stop + - restart + - kill + - pause + - unpause + - remove + type: string + required: + - names + - operation + type: object + dto.ContainerPrune: + properties: + pruneType: + enum: + - container + - image + - volume + - network + - buildcache + type: string + withTagAll: + type: boolean + required: + - pruneType + type: object + dto.ContainerPruneReport: + properties: + deletedNumber: + type: integer + spaceReclaimed: + type: integer + type: object + dto.ContainerRename: + properties: + name: + type: string + newName: + type: string + required: + - name + - newName + type: object + dto.ContainerStats: + properties: + cache: + type: number + cpuPercent: + type: number + ioRead: + type: number + ioWrite: + type: number + memory: + type: number + networkRX: + type: number + networkTX: + type: number + shotTime: + type: string + type: object + dto.ContainerUpgrade: + properties: + forcePull: + type: boolean + image: + type: string + name: + type: string + required: + - image + - name + type: object + dto.CronjobBatchDelete: + properties: + cleanData: + type: boolean + ids: + items: + type: integer + type: array + required: + - ids + type: object + dto.CronjobClean: + properties: + cleanData: + type: boolean + cronjobID: + type: integer + isDelete: + type: boolean + required: + - cronjobID + type: object + dto.CronjobCreate: + properties: + appID: + type: string + backupAccounts: + type: string + command: + type: string + containerName: + type: string + dbName: + type: string + dbType: + type: string + defaultDownload: + type: string + exclusionRules: + type: string + name: + type: string + retainCopies: + minimum: 1 + type: integer + script: + type: string + secret: + type: string + sourceDir: + type: string + spec: + type: string + type: + type: string + url: + type: string + website: + type: string + required: + - name + - spec + - type + type: object + dto.CronjobDownload: + properties: + backupAccountID: + type: integer + recordID: + type: integer + required: + - backupAccountID + - recordID + type: object + dto.CronjobUpdate: + properties: + appID: + type: string + backupAccounts: + type: string + command: + type: string + containerName: + type: string + dbName: + type: string + dbType: + type: string + defaultDownload: + type: string + exclusionRules: + type: string + id: + type: integer + name: + type: string + retainCopies: + minimum: 1 + type: integer + script: + type: string + secret: + type: string + sourceDir: + type: string + spec: + type: string + url: + type: string + website: + type: string + required: + - id + - name + - spec + type: object + dto.CronjobUpdateStatus: + properties: + id: + type: integer + status: + type: string + required: + - id + - status + type: object + dto.DBBaseInfo: + properties: + containerName: + type: string + name: + type: string + port: + type: integer + type: object + dto.DBConfUpdateByFile: + properties: + database: + type: string + file: + type: string + type: + enum: + - mysql + - mariadb + - postgresql + - redis + type: string + required: + - database + - type + type: object + dto.DaemonJsonConf: + properties: + cgroupDriver: + type: string + experimental: + type: boolean + fixedCidrV6: + type: string + insecureRegistries: + items: + type: string + type: array + ip6Tables: + type: boolean + iptables: + type: boolean + ipv6: + type: boolean + isSwarm: + type: boolean + liveRestore: + type: boolean + logMaxFile: + type: string + logMaxSize: + type: string + registryMirrors: + items: + type: string + type: array + status: + type: string + version: + type: string + type: object + dto.DaemonJsonUpdateByFile: + properties: + file: + type: string + type: object + dto.DashboardBase: + properties: + appInstalledNumber: + type: integer + cpuCores: + type: integer + cpuLogicalCores: + type: integer + cpuModelName: + type: string + cronjobNumber: + type: integer + currentInfo: + $ref: '#/definitions/dto.DashboardCurrent' + databaseNumber: + type: integer + hostname: + type: string + kernelArch: + type: string + kernelVersion: + type: string + os: + type: string + platform: + type: string + platformFamily: + type: string + platformVersion: + type: string + virtualizationSystem: + type: string + websiteNumber: + type: integer + type: object + dto.DashboardCurrent: + properties: + cpuPercent: + items: + type: number + type: array + cpuTotal: + type: integer + cpuUsed: + type: number + cpuUsedPercent: + type: number + diskData: + items: + $ref: '#/definitions/dto.DiskInfo' + type: array + gpuData: + items: + $ref: '#/definitions/dto.GPUInfo' + type: array + ioCount: + type: integer + ioReadBytes: + type: integer + ioReadTime: + type: integer + ioWriteBytes: + type: integer + ioWriteTime: + type: integer + load1: + type: number + load5: + type: number + load15: + type: number + loadUsagePercent: + type: number + memoryAvailable: + type: integer + memoryTotal: + type: integer + memoryUsed: + type: integer + memoryUsedPercent: + type: number + netBytesRecv: + type: integer + netBytesSent: + type: integer + procs: + type: integer + shotTime: + type: string + swapMemoryAvailable: + type: integer + swapMemoryTotal: + type: integer + swapMemoryUsed: + type: integer + swapMemoryUsedPercent: + type: number + timeSinceUptime: + type: string + uptime: + type: integer + type: object + dto.DatabaseCreate: + properties: + address: + type: string + clientCert: + type: string + clientKey: + type: string + description: + type: string + from: + enum: + - local + - remote + type: string + name: + maxLength: 256 + type: string + password: + type: string + port: + type: integer + rootCert: + type: string + skipVerify: + type: boolean + ssl: + type: boolean + type: + type: string + username: + type: string + version: + type: string + required: + - from + - name + - type + - username + - version + type: object + dto.DatabaseDelete: + properties: + deleteBackup: + type: boolean + forceDelete: + type: boolean + id: + type: integer + required: + - id + type: object + dto.DatabaseInfo: + properties: + address: + type: string + clientCert: + type: string + clientKey: + type: string + createdAt: + type: string + description: + type: string + from: + type: string + id: + type: integer + name: + maxLength: 256 + type: string + password: + type: string + port: + type: integer + rootCert: + type: string + skipVerify: + type: boolean + ssl: + type: boolean + type: + type: string + username: + type: string + version: + type: string + type: object + dto.DatabaseItem: + properties: + database: + type: string + from: + type: string + id: + type: integer + name: + type: string + type: object + dto.DatabaseOption: + properties: + address: + type: string + database: + type: string + from: + type: string + id: + type: integer + type: + type: string + version: + type: string + type: object + dto.DatabaseSearch: + properties: + info: + type: string + order: + enum: + - "null" + - ascending + - descending + type: string + orderBy: + enum: + - name + - created_at + type: string + page: + type: integer + pageSize: + type: integer + type: + type: string + required: + - order + - orderBy + - page + - pageSize + type: object + dto.DatabaseUpdate: + properties: + address: + type: string + clientCert: + type: string + clientKey: + type: string + description: + type: string + id: + type: integer + password: + type: string + port: + type: integer + rootCert: + type: string + skipVerify: + type: boolean + ssl: + type: boolean + type: + type: string + username: + type: string + version: + type: string + required: + - type + - username + - version + type: object + dto.DeviceBaseInfo: + properties: + dns: + items: + type: string + type: array + hostname: + type: string + hosts: + items: + $ref: '#/definitions/dto.HostHelper' + type: array + localTime: + type: string + maxSize: + type: integer + ntp: + type: string + swapDetails: + items: + $ref: '#/definitions/dto.SwapHelper' + type: array + swapMemoryAvailable: + type: integer + swapMemoryTotal: + type: integer + swapMemoryUsed: + type: integer + timeZone: + type: string + user: + type: string + type: object + dto.DiskInfo: + properties: + device: + type: string + free: + type: integer + inodesFree: + type: integer + inodesTotal: + type: integer + inodesUsed: + type: integer + inodesUsedPercent: + type: number + path: + type: string + total: + type: integer + type: + type: string + used: + type: integer + usedPercent: + type: number + type: object + dto.DockerOperation: + properties: + operation: + enum: + - start + - restart + - stop + type: string + required: + - operation + type: object + dto.DownloadRecord: + properties: + fileDir: + type: string + fileName: + type: string + source: + enum: + - OSS + - S3 + - SFTP + - MINIO + - LOCAL + - COS + - KODO + - OneDrive + - WebDAV + type: string + required: + - fileDir + - fileName + - source + type: object + dto.Fail2BanBaseInfo: + properties: + banAction: + type: string + banTime: + type: string + findTime: + type: string + isActive: + type: boolean + isEnable: + type: boolean + isExist: + type: boolean + logPath: + type: string + maxRetry: + type: integer + port: + type: integer + version: + type: string + type: object + dto.Fail2BanSearch: + properties: + status: + enum: + - banned + - ignore + type: string + required: + - status + type: object + dto.Fail2BanUpdate: + properties: + key: + enum: + - port + - bantime + - findtime + - maxretry + - banaction + - logpath + - port + type: string + value: + type: string + required: + - key + type: object + dto.FirewallBaseInfo: + properties: + name: + type: string + pingStatus: + type: string + status: + type: string + version: + type: string + type: object + dto.FirewallOperation: + properties: + operation: + enum: + - start + - stop + - restart + - disablePing + - enablePing + type: string + required: + - operation + type: object + dto.ForBuckets: + properties: + accessKey: + type: string + credential: + type: string + type: + type: string + vars: + type: string + required: + - credential + - type + - vars + type: object + dto.ForwardRuleOperate: + properties: + rules: + items: + properties: + num: + type: string + operation: + enum: + - add + - remove + type: string + port: + type: string + protocol: + enum: + - tcp + - udp + - tcp/udp + type: string + targetIP: + type: string + targetPort: + type: string + required: + - operation + - port + - protocol + - targetPort + type: object + type: array + type: object + dto.FtpBaseInfo: + properties: + isActive: + type: boolean + isExist: + type: boolean + type: object + dto.FtpCreate: + properties: + description: + type: string + password: + type: string + path: + type: string + user: + type: string + required: + - password + - path + - user + type: object + dto.FtpLogSearch: + properties: + operation: + type: string + page: + type: integer + pageSize: + type: integer + user: + type: string + required: + - page + - pageSize + type: object + dto.FtpUpdate: + properties: + description: + type: string + id: + type: integer + password: + type: string + path: + type: string + status: + type: string + required: + - password + - path + type: object + dto.GPUInfo: + properties: + fanSpeed: + type: string + gpuUtil: + type: string + index: + type: integer + maxPowerLimit: + type: string + memTotal: + type: string + memUsed: + type: string + memoryUsage: + type: string + performanceState: + type: string + powerDraw: + type: string + powerUsage: + type: string + productName: + type: string + temperature: + type: string + type: object + dto.GenerateLoad: + properties: + encryptionMode: + enum: + - rsa + - ed25519 + - ecdsa + - dsa + type: string + required: + - encryptionMode + type: object + dto.GenerateSSH: + properties: + encryptionMode: + enum: + - rsa + - ed25519 + - ecdsa + - dsa + type: string + password: + type: string + required: + - encryptionMode + type: object + dto.GroupCreate: + properties: + id: + type: integer + name: + type: string + type: + type: string + required: + - name + - type + type: object + dto.GroupInfo: + properties: + id: + type: integer + isDefault: + type: boolean + name: + type: string + type: + type: string + type: object + dto.GroupSearch: + properties: + type: + type: string + required: + - type + type: object + dto.GroupUpdate: + properties: + id: + type: integer + isDefault: + type: boolean + name: + type: string + type: + type: string + required: + - type + type: object + dto.HostConnTest: + properties: + addr: + type: string + authMode: + enum: + - password + - key + type: string + passPhrase: + type: string + password: + type: string + port: + maximum: 65535 + minimum: 1 + type: integer + privateKey: + type: string + user: + type: string + required: + - addr + - port + - user + type: object + dto.HostHelper: + properties: + host: + type: string + ip: + type: string + type: object + dto.HostOperate: + properties: + addr: + type: string + authMode: + enum: + - password + - key + type: string + description: + type: string + groupID: + type: integer + id: + type: integer + name: + type: string + passPhrase: + type: string + password: + type: string + port: + maximum: 65535 + minimum: 1 + type: integer + privateKey: + type: string + rememberPassword: + type: boolean + user: + type: string + required: + - addr + - port + - user + type: object + dto.HostTree: + properties: + children: + items: + $ref: '#/definitions/dto.TreeChild' + type: array + id: + type: integer + label: + type: string + type: object + dto.ImageBuild: + properties: + dockerfile: + type: string + from: + type: string + name: + type: string + tags: + items: + type: string + type: array + required: + - dockerfile + - from + - name + type: object + dto.ImageInfo: + properties: + createdAt: + type: string + id: + type: string + isUsed: + type: boolean + size: + type: string + tags: + items: + type: string + type: array + type: object + dto.ImageLoad: + properties: + path: + type: string + required: + - path + type: object + dto.ImagePull: + properties: + imageName: + type: string + repoID: + type: integer + required: + - imageName + type: object + dto.ImagePush: + properties: + name: + type: string + repoID: + type: integer + tagName: + type: string + required: + - name + - repoID + - tagName + type: object + dto.ImageRepoDelete: + properties: + ids: + items: + type: integer + type: array + required: + - ids + type: object + dto.ImageRepoOption: + properties: + downloadUrl: + type: string + id: + type: integer + name: + type: string + type: object + dto.ImageRepoUpdate: + properties: + auth: + type: boolean + downloadUrl: + type: string + id: + type: integer + password: + maxLength: 256 + type: string + protocol: + type: string + username: + maxLength: 256 + type: string + type: object + dto.ImageSave: + properties: + name: + type: string + path: + type: string + tagName: + type: string + required: + - name + - path + - tagName + type: object + dto.ImageTag: + properties: + sourceID: + type: string + targetName: + type: string + required: + - sourceID + - targetName + type: object + dto.InspectReq: + properties: + id: + type: string + type: + type: string + required: + - id + - type + type: object + dto.LogOption: + properties: + logMaxFile: + type: string + logMaxSize: + type: string + type: object + dto.Login: + properties: + authMethod: + enum: + - jwt + - session + type: string + captcha: + type: string + captchaID: + type: string + ignoreCaptcha: + type: boolean + language: + enum: + - zh + - en + - tw + type: string + name: + type: string + password: + type: string + required: + - authMethod + - language + - name + - password + type: object + dto.MFALogin: + properties: + authMethod: + type: string + code: + type: string + name: + type: string + password: + type: string + required: + - code + - name + - password + type: object + dto.MfaCredential: + properties: + code: + type: string + interval: + type: string + secret: + type: string + required: + - code + - interval + - secret + type: object + dto.MonitorSearch: + properties: + endTime: + type: string + info: + type: string + param: + enum: + - all + - cpu + - memory + - load + - io + - network + type: string + startTime: + type: string + required: + - param + type: object + dto.MysqlDBCreate: + properties: + database: + type: string + description: + type: string + format: + enum: + - utf8mb4 + - utf8 + - gbk + - big5 + type: string + from: + enum: + - local + - remote + type: string + name: + type: string + password: + type: string + permission: + type: string + username: + type: string + required: + - database + - format + - from + - name + - password + - permission + - username + type: object + dto.MysqlDBDelete: + properties: + database: + type: string + deleteBackup: + type: boolean + forceDelete: + type: boolean + id: + type: integer + type: + enum: + - mysql + - mariadb + type: string + required: + - database + - id + - type + type: object + dto.MysqlDBDeleteCheck: + properties: + database: + type: string + id: + type: integer + type: + enum: + - mysql + - mariadb + type: string + required: + - database + - id + - type + type: object + dto.MysqlDBSearch: + properties: + database: + type: string + info: + type: string + order: + enum: + - "null" + - ascending + - descending + type: string + orderBy: + enum: + - name + - created_at + type: string + page: + type: integer + pageSize: + type: integer + required: + - database + - order + - orderBy + - page + - pageSize + type: object + dto.MysqlLoadDB: + properties: + database: + type: string + from: + enum: + - local + - remote + type: string + type: + enum: + - mysql + - mariadb + type: string + required: + - database + - from + - type + type: object + dto.MysqlOption: + properties: + database: + type: string + from: + type: string + id: + type: integer + name: + type: string + type: + type: string + type: object + dto.MysqlStatus: + properties: + Aborted_clients: + type: string + Aborted_connects: + type: string + Bytes_received: + type: string + Bytes_sent: + type: string + Com_commit: + type: string + Com_rollback: + type: string + Connections: + type: string + Created_tmp_disk_tables: + type: string + Created_tmp_tables: + type: string + File: + type: string + Innodb_buffer_pool_pages_dirty: + type: string + Innodb_buffer_pool_read_requests: + type: string + Innodb_buffer_pool_reads: + type: string + Key_read_requests: + type: string + Key_reads: + type: string + Key_write_requests: + type: string + Key_writes: + type: string + Max_used_connections: + type: string + Open_tables: + type: string + Opened_files: + type: string + Opened_tables: + type: string + Position: + type: string + Qcache_hits: + type: string + Qcache_inserts: + type: string + Questions: + type: string + Run: + type: string + Select_full_join: + type: string + Select_range_check: + type: string + Sort_merge_passes: + type: string + Table_locks_waited: + type: string + Threads_cached: + type: string + Threads_connected: + type: string + Threads_created: + type: string + Threads_running: + type: string + Uptime: + type: string + type: object + dto.MysqlVariables: + properties: + binlog_cache_size: + type: string + innodb_buffer_pool_size: + type: string + innodb_log_buffer_size: + type: string + join_buffer_size: + type: string + key_buffer_size: + type: string + long_query_time: + type: string + max_connections: + type: string + max_heap_table_size: + type: string + query_cache_size: + type: string + query_cache_type: + type: string + read_buffer_size: + type: string + read_rnd_buffer_size: + type: string + slow_query_log: + type: string + sort_buffer_size: + type: string + table_open_cache: + type: string + thread_cache_size: + type: string + thread_stack: + type: string + tmp_table_size: + type: string + type: object + dto.MysqlVariablesUpdate: + properties: + database: + type: string + type: + enum: + - mysql + - mariadb + type: string + variables: + items: + $ref: '#/definitions/dto.MysqlVariablesUpdateHelper' + type: array + required: + - database + - type + type: object + dto.MysqlVariablesUpdateHelper: + properties: + param: + type: string + value: {} + type: object + dto.NetworkCreate: + properties: + auxAddress: + items: + $ref: '#/definitions/dto.SettingUpdate' + type: array + auxAddressV6: + items: + $ref: '#/definitions/dto.SettingUpdate' + type: array + driver: + type: string + gateway: + type: string + gatewayV6: + type: string + ipRange: + type: string + ipRangeV6: + type: string + ipv4: + type: boolean + ipv6: + type: boolean + labels: + items: + type: string + type: array + name: + type: string + options: + items: + type: string + type: array + subnet: + type: string + subnetV6: + type: string + required: + - driver + - name + type: object + dto.NginxKey: + enum: + - index + - limit-conn + - ssl + - cache + - http-per + - proxy-cache + type: string + x-enum-varnames: + - Index + - LimitConn + - SSL + - CACHE + - HttpPer + - ProxyCache + dto.OneDriveInfo: + properties: + client_id: + type: string + client_secret: + type: string + redirect_uri: + type: string + type: object + dto.Operate: + properties: + operation: + type: string + required: + - operation + type: object + dto.OperateByID: + properties: + id: + type: integer + required: + - id + type: object + dto.OperationWithName: + properties: + name: + type: string + required: + - name + type: object + dto.OperationWithNameAndType: + properties: + name: + type: string + type: + type: string + required: + - type + type: object + dto.Options: + properties: + option: + type: string + type: object + dto.OsInfo: + properties: + diskSize: + type: integer + kernelArch: + type: string + kernelVersion: + type: string + os: + type: string + platform: + type: string + platformFamily: + type: string + type: object + dto.PageContainer: + properties: + excludeAppStore: + type: boolean + filters: + type: string + name: + type: string + order: + enum: + - "null" + - ascending + - descending + type: string + orderBy: + enum: + - name + - state + - created_at + type: string + page: + type: integer + pageSize: + type: integer + state: + enum: + - all + - created + - running + - paused + - restarting + - removing + - exited + - dead + type: string + required: + - order + - orderBy + - page + - pageSize + - state + type: object + dto.PageCronjob: + properties: + info: + type: string + order: + enum: + - "null" + - ascending + - descending + type: string + orderBy: + enum: + - name + - status + - created_at + type: string + page: + type: integer + pageSize: + type: integer + required: + - order + - orderBy + - page + - pageSize + type: object + dto.PageInfo: + properties: + page: + type: integer + pageSize: + type: integer + required: + - page + - pageSize + type: object + dto.PageResult: + properties: + items: {} + total: + type: integer + type: object + dto.PasswordUpdate: + properties: + newPassword: + type: string + oldPassword: + type: string + required: + - newPassword + - oldPassword + type: object + dto.PortHelper: + properties: + containerPort: + type: string + hostIP: + type: string + hostPort: + type: string + protocol: + type: string + type: object + dto.PortRuleOperate: + properties: + address: + type: string + description: + type: string + operation: + enum: + - add + - remove + type: string + port: + type: string + protocol: + enum: + - tcp + - udp + - tcp/udp + type: string + strategy: + enum: + - accept + - drop + type: string + required: + - operation + - port + - protocol + - strategy + type: object + dto.PortRuleUpdate: + properties: + newRule: + $ref: '#/definitions/dto.PortRuleOperate' + oldRule: + $ref: '#/definitions/dto.PortRuleOperate' + type: object + dto.PortUpdate: + properties: + serverPort: + maximum: 65535 + minimum: 1 + type: integer + required: + - serverPort + type: object + dto.PostgresqlBindUser: + properties: + database: + type: string + name: + type: string + password: + type: string + superUser: + type: boolean + username: + type: string + required: + - database + - name + - password + - username + type: object + dto.PostgresqlDBCreate: + properties: + database: + type: string + description: + type: string + format: + type: string + from: + enum: + - local + - remote + type: string + name: + type: string + password: + type: string + superUser: + type: boolean + username: + type: string + required: + - database + - from + - name + - password + - username + type: object + dto.PostgresqlDBDelete: + properties: + database: + type: string + deleteBackup: + type: boolean + forceDelete: + type: boolean + id: + type: integer + type: + enum: + - postgresql + type: string + required: + - database + - id + - type + type: object + dto.PostgresqlDBDeleteCheck: + properties: + database: + type: string + id: + type: integer + type: + enum: + - postgresql + type: string + required: + - database + - id + - type + type: object + dto.PostgresqlDBSearch: + properties: + database: + type: string + info: + type: string + order: + enum: + - "null" + - ascending + - descending + type: string + orderBy: + enum: + - name + - created_at + type: string + page: + type: integer + pageSize: + type: integer + required: + - database + - order + - orderBy + - page + - pageSize + type: object + dto.PostgresqlLoadDB: + properties: + database: + type: string + from: + enum: + - local + - remote + type: string + type: + enum: + - postgresql + type: string + required: + - database + - from + - type + type: object + dto.ProxyUpdate: + properties: + proxyPasswd: + type: string + proxyPasswdKeep: + type: string + proxyPort: + type: string + proxyType: + type: string + proxyUrl: + type: string + proxyUser: + type: string + type: object + dto.RecordSearch: + properties: + detailName: + type: string + name: + type: string + page: + type: integer + pageSize: + type: integer + type: + type: string + required: + - page + - pageSize + - type + type: object + dto.RecordSearchByCronjob: + properties: + cronjobID: + type: integer + page: + type: integer + pageSize: + type: integer + required: + - cronjobID + - page + - pageSize + type: object + dto.RedisCommand: + properties: + command: + type: string + id: + type: integer + name: + type: string + type: object + dto.RedisConf: + properties: + containerName: + type: string + database: + type: string + maxclients: + type: string + maxmemory: + type: string + name: + type: string + port: + type: integer + requirepass: + type: string + timeout: + type: string + required: + - database + type: object + dto.RedisConfPersistenceUpdate: + properties: + appendfsync: + type: string + appendonly: + type: string + database: + type: string + save: + type: string + type: + enum: + - aof + - rbd + type: string + required: + - database + - type + type: object + dto.RedisConfUpdate: + properties: + database: + type: string + maxclients: + type: string + maxmemory: + type: string + timeout: + type: string + required: + - database + type: object + dto.RedisPersistence: + properties: + appendfsync: + type: string + appendonly: + type: string + database: + type: string + save: + type: string + required: + - database + type: object + dto.RedisStatus: + properties: + connected_clients: + type: string + database: + type: string + instantaneous_ops_per_sec: + type: string + keyspace_hits: + type: string + keyspace_misses: + type: string + latest_fork_usec: + type: string + mem_fragmentation_ratio: + type: string + tcp_port: + type: string + total_commands_processed: + type: string + total_connections_received: + type: string + uptime_in_days: + type: string + used_memory: + type: string + used_memory_peak: + type: string + used_memory_rss: + type: string + required: + - database + type: object + dto.ResourceLimit: + properties: + cpu: + type: integer + memory: + type: integer + type: object + dto.RuleSearch: + properties: + info: + type: string + page: + type: integer + pageSize: + type: integer + status: + type: string + strategy: + type: string + type: + type: string + required: + - page + - pageSize + - type + type: object + dto.SSHConf: + properties: + file: + type: string + type: object + dto.SSHHistory: + properties: + address: + type: string + area: + type: string + authMode: + type: string + date: + type: string + dateStr: + type: string + message: + type: string + port: + type: string + status: + type: string + user: + type: string + type: object + dto.SSHInfo: + properties: + autoStart: + type: boolean + listenAddress: + type: string + message: + type: string + passwordAuthentication: + type: string + permitRootLogin: + type: string + port: + type: string + pubkeyAuthentication: + type: string + status: + type: string + useDNS: + type: string + type: object + dto.SSHLog: + properties: + failedCount: + type: integer + logs: + items: + $ref: '#/definitions/dto.SSHHistory' + type: array + successfulCount: + type: integer + totalCount: + type: integer + type: object + dto.SSHUpdate: + properties: + key: + type: string + newValue: + type: string + oldValue: + type: string + required: + - key + type: object + dto.SSLUpdate: + properties: + cert: + type: string + domain: + type: string + key: + type: string + ssl: + enum: + - enable + - disable + type: string + sslID: + type: integer + sslType: + enum: + - self + - select + - import + - import-paste + - import-local + type: string + required: + - ssl + - sslType + type: object + dto.SearchForTree: + properties: + info: + type: string + type: object + dto.SearchHostWithPage: + properties: + groupID: + type: integer + info: + type: string + page: + type: integer + pageSize: + type: integer + required: + - page + - pageSize + type: object + dto.SearchLgLogWithPage: + properties: + ip: + type: string + page: + type: integer + pageSize: + type: integer + status: + type: string + required: + - page + - pageSize + type: object + dto.SearchOpLogWithPage: + properties: + operation: + type: string + page: + type: integer + pageSize: + type: integer + source: + type: string + status: + type: string + required: + - page + - pageSize + type: object + dto.SearchRecord: + properties: + cronjobID: + type: integer + endTime: + type: string + page: + type: integer + pageSize: + type: integer + startTime: + type: string + status: + type: string + required: + - page + - pageSize + type: object + dto.SearchSSHLog: + properties: + Status: + enum: + - Success + - Failed + - All + type: string + info: + type: string + page: + type: integer + pageSize: + type: integer + required: + - Status + - page + - pageSize + type: object + dto.SearchWithPage: + properties: + info: + type: string + page: + type: integer + pageSize: + type: integer + required: + - page + - pageSize + type: object + dto.SettingInfo: + properties: + allowIPs: + type: string + appStoreLastModified: + type: string + appStoreSyncStatus: + type: string + appStoreVersion: + type: string + bindAddress: + type: string + bindDomain: + type: string + complexityVerification: + type: string + defaultNetwork: + type: string + developerMode: + type: string + dingVars: + type: string + dockerSockPath: + type: string + email: + type: string + emailVars: + type: string + expirationDays: + type: string + expirationTime: + type: string + fileRecycleBin: + type: string + ipv6: + type: string + language: + type: string + lastCleanData: + type: string + lastCleanSize: + type: string + lastCleanTime: + type: string + localTime: + type: string + menuTabs: + type: string + messageType: + type: string + mfaInterval: + type: string + mfaSecret: + type: string + mfaStatus: + type: string + monitorInterval: + type: string + monitorStatus: + type: string + monitorStoreDays: + type: string + noAuthSetting: + type: string + ntpSite: + type: string + panelName: + type: string + port: + type: string + proxyPasswd: + type: string + proxyPasswdKeep: + type: string + proxyPort: + type: string + proxyType: + type: string + proxyUrl: + type: string + proxyUser: + type: string + securityEntrance: + type: string + serverPort: + type: string + sessionTimeout: + type: string + snapshotIgnore: + type: string + ssl: + type: string + sslType: + type: string + systemIP: + type: string + systemVersion: + type: string + theme: + type: string + timeZone: + type: string + userName: + type: string + weChatVars: + type: string + xpackHideMenu: + type: string + type: object + dto.SettingUpdate: + properties: + key: + type: string + value: + type: string + required: + - key + type: object + dto.SnapshotBatchDelete: + properties: + deleteWithFile: + type: boolean + ids: + items: + type: integer + type: array + required: + - ids + type: object + dto.SnapshotCreate: + properties: + defaultDownload: + type: string + description: + maxLength: 256 + type: string + from: + type: string + id: + type: integer + secret: + type: string + required: + - defaultDownload + - from + type: object + dto.SnapshotImport: + properties: + description: + maxLength: 256 + type: string + from: + type: string + names: + items: + type: string + type: array + type: object + dto.SnapshotRecover: + properties: + id: + type: integer + isNew: + type: boolean + reDownload: + type: boolean + secret: + type: string + required: + - id + type: object + dto.SwapHelper: + properties: + isNew: + type: boolean + path: + type: string + size: + type: integer + used: + type: string + required: + - path + type: object + dto.TreeChild: + properties: + id: + type: integer + label: + type: string + type: object + dto.UpdateByFile: + properties: + file: + type: string + type: object + dto.UpdateByNameAndFile: + properties: + file: + type: string + name: + type: string + type: object + dto.UpdateDescription: + properties: + description: + maxLength: 256 + type: string + id: + type: integer + required: + - id + type: object + dto.UpdateFirewallDescription: + properties: + address: + type: string + description: + type: string + port: + type: string + protocol: + type: string + strategy: + enum: + - accept + - drop + type: string + type: + type: string + required: + - strategy + type: object + dto.Upgrade: + properties: + version: + type: string + required: + - version + type: object + dto.UpgradeInfo: + properties: + latestVersion: + type: string + newVersion: + type: string + releaseNote: + type: string + testVersion: + type: string + type: object + dto.UserLoginInfo: + properties: + mfaStatus: + type: string + name: + type: string + token: + type: string + type: object + dto.VolumeCreate: + properties: + driver: + type: string + labels: + items: + type: string + type: array + name: + type: string + options: + items: + type: string + type: array + required: + - driver + - name + type: object + dto.VolumeHelper: + properties: + containerDir: + type: string + mode: + type: string + sourceDir: + type: string + type: + type: string + type: object + files.FileInfo: + properties: + content: + type: string + extension: + type: string + favoriteID: + type: integer + gid: + type: string + group: + type: string + isDetail: + type: boolean + isDir: + type: boolean + isHidden: + type: boolean + isSymlink: + type: boolean + itemTotal: + type: integer + items: + items: + $ref: '#/definitions/files.FileInfo' + type: array + linkPath: + type: string + mimeType: + type: string + modTime: + type: string + mode: + type: string + name: + type: string + path: + type: string + size: + type: integer + type: + type: string + uid: + type: string + updateTime: + type: string + user: + type: string + type: object + mfa.Otp: + properties: + qrImage: + type: string + secret: + type: string + type: object + model.App: + properties: + createdAt: + type: string + crossVersionUpdate: + type: boolean + document: + type: string + github: + type: string + icon: + type: string + id: + type: integer + key: + type: string + lastModified: + type: integer + limit: + type: integer + name: + type: string + readMe: + type: string + recommend: + type: integer + required: + type: string + resource: + type: string + shortDescEn: + type: string + shortDescZh: + type: string + status: + type: string + tags: + items: + type: string + type: array + type: + type: string + updatedAt: + type: string + website: + type: string + type: object + model.AppInstall: + properties: + app: + $ref: '#/definitions/model.App' + appDetailId: + type: integer + appId: + type: integer + containerName: + type: string + createdAt: + type: string + description: + type: string + dockerCompose: + type: string + env: + type: string + httpPort: + type: integer + httpsPort: + type: integer + id: + type: integer + message: + type: string + name: + type: string + param: + type: string + serviceName: + type: string + status: + type: string + updatedAt: + type: string + version: + type: string + type: object + model.Tag: + properties: + createdAt: + type: string + id: + type: integer + key: + type: string + name: + type: string + sort: + type: integer + updatedAt: + type: string + type: object + model.Website: + properties: + IPV6: + type: boolean + accessLog: + type: boolean + alias: + type: string + appInstallId: + type: integer + createdAt: + type: string + defaultServer: + type: boolean + domains: + items: + $ref: '#/definitions/model.WebsiteDomain' + type: array + errorLog: + type: boolean + expireDate: + type: string + ftpId: + type: integer + group: + type: string + httpConfig: + type: string + id: + type: integer + primaryDomain: + type: string + protocol: + type: string + proxy: + type: string + proxyType: + type: string + remark: + type: string + rewrite: + type: string + runtimeID: + type: integer + siteDir: + type: string + status: + type: string + type: + type: string + updatedAt: + type: string + user: + type: string + webSiteGroupId: + type: integer + webSiteSSL: + $ref: '#/definitions/model.WebsiteSSL' + webSiteSSLId: + type: integer + type: object + model.WebsiteAcmeAccount: + properties: + createdAt: + type: string + eabHmacKey: + type: string + eabKid: + type: string + email: + type: string + id: + type: integer + keyType: + type: string + type: + type: string + updatedAt: + type: string + url: + type: string + type: object + model.WebsiteDnsAccount: + properties: + createdAt: + type: string + id: + type: integer + name: + type: string + type: + type: string + updatedAt: + type: string + type: object + model.WebsiteDomain: + properties: + createdAt: + type: string + domain: + type: string + id: + type: integer + port: + type: integer + updatedAt: + type: string + websiteId: + type: integer + type: object + model.WebsiteSSL: + properties: + acmeAccount: + $ref: '#/definitions/model.WebsiteAcmeAccount' + acmeAccountId: + type: integer + autoRenew: + type: boolean + caId: + type: integer + certURL: + type: string + createdAt: + type: string + description: + type: string + dir: + type: string + disableCNAME: + type: boolean + dnsAccount: + $ref: '#/definitions/model.WebsiteDnsAccount' + dnsAccountId: + type: integer + domains: + type: string + execShell: + type: boolean + expireDate: + type: string + id: + type: integer + keyType: + type: string + message: + type: string + nameserver1: + type: string + nameserver2: + type: string + organization: + type: string + pem: + type: string + primaryDomain: + type: string + privateKey: + type: string + provider: + type: string + pushDir: + type: boolean + shell: + type: string + skipDNS: + type: boolean + startDate: + type: string + status: + type: string + type: + type: string + updatedAt: + type: string + websites: + items: + $ref: '#/definitions/model.Website' + type: array + type: object + request.AppInstallCreate: + properties: + advanced: + type: boolean + allowPort: + type: boolean + appDetailId: + type: integer + containerName: + type: string + cpuQuota: + type: number + dockerCompose: + type: string + editCompose: + type: boolean + hostMode: + type: boolean + memoryLimit: + type: number + memoryUnit: + type: string + name: + type: string + params: + additionalProperties: true + type: object + pullImage: + type: boolean + services: + additionalProperties: + type: string + type: object + required: + - appDetailId + - name + type: object + request.AppInstalledIgnoreUpgrade: + properties: + detailID: + type: integer + operate: + enum: + - cancel + - ignore + type: string + required: + - detailID + - operate + type: object + request.AppInstalledInfo: + properties: + key: + type: string + name: + type: string + required: + - key + type: object + request.AppInstalledOperate: + properties: + backup: + type: boolean + backupId: + type: integer + deleteBackup: + type: boolean + deleteDB: + type: boolean + detailId: + type: integer + dockerCompose: + type: string + forceDelete: + type: boolean + installId: + type: integer + operate: + type: string + pullImage: + type: boolean + required: + - installId + - operate + type: object + request.AppInstalledSearch: + properties: + all: + type: boolean + name: + type: string + page: + type: integer + pageSize: + type: integer + sync: + type: boolean + tags: + items: + type: string + type: array + type: + type: string + unused: + type: boolean + update: + type: boolean + required: + - page + - pageSize + type: object + request.AppInstalledUpdate: + properties: + advanced: + type: boolean + allowPort: + type: boolean + containerName: + type: string + cpuQuota: + type: number + dockerCompose: + type: string + editCompose: + type: boolean + hostMode: + type: boolean + installId: + type: integer + memoryLimit: + type: number + memoryUnit: + type: string + params: + additionalProperties: true + type: object + pullImage: + type: boolean + required: + - installId + - params + type: object + request.AppSearch: + properties: + name: + type: string + page: + type: integer + pageSize: + type: integer + recommend: + type: boolean + resource: + type: string + tags: + items: + type: string + type: array + type: + type: string + required: + - page + - pageSize + type: object + request.DirSizeReq: + properties: + path: + type: string + required: + - path + type: object + request.ExposedPort: + properties: + containerPort: + type: integer + hostPort: + type: integer + type: object + request.FavoriteCreate: + properties: + path: + type: string + required: + - path + type: object + request.FavoriteDelete: + properties: + id: + type: integer + required: + - id + type: object + request.FileBatchDelete: + properties: + isDir: + type: boolean + paths: + items: + type: string + type: array + required: + - paths + type: object + request.FileCompress: + properties: + dst: + type: string + files: + items: + type: string + type: array + name: + type: string + replace: + type: boolean + secret: + type: string + type: + type: string + required: + - dst + - files + - name + - type + type: object + request.FileContentReq: + properties: + isDetail: + type: boolean + path: + type: string + required: + - path + type: object + request.FileCreate: + properties: + content: + type: string + isDir: + type: boolean + isLink: + type: boolean + isSymlink: + type: boolean + linkPath: + type: string + mode: + type: integer + path: + type: string + sub: + type: boolean + required: + - path + type: object + request.FileDeCompress: + properties: + dst: + type: string + path: + type: string + secret: + type: string + type: + type: string + required: + - dst + - path + - type + type: object + request.FileDelete: + properties: + forceDelete: + type: boolean + isDir: + type: boolean + path: + type: string + required: + - path + type: object + request.FileDownload: + properties: + compress: + type: boolean + name: + type: string + paths: + items: + type: string + type: array + type: + type: string + required: + - name + - paths + - type + type: object + request.FileEdit: + properties: + content: + type: string + path: + type: string + required: + - path + type: object + request.FileMove: + properties: + cover: + type: boolean + name: + type: string + newPath: + type: string + oldPaths: + items: + type: string + type: array + type: + type: string + required: + - newPath + - oldPaths + - type + type: object + request.FileOption: + properties: + containSub: + type: boolean + dir: + type: boolean + expand: + type: boolean + isDetail: + type: boolean + page: + type: integer + pageSize: + type: integer + path: + type: string + search: + type: string + showHidden: + type: boolean + sortBy: + type: string + sortOrder: + type: string + type: object + request.FilePathCheck: + properties: + path: + type: string + required: + - path + type: object + request.FileReadByLineReq: + properties: + ID: + type: integer + latest: + type: boolean + name: + type: string + page: + type: integer + pageSize: + type: integer + type: + type: string + required: + - page + - pageSize + - type + type: object + request.FileRename: + properties: + newName: + type: string + oldName: + type: string + required: + - newName + - oldName + type: object + request.FileRoleReq: + properties: + group: + type: string + mode: + type: integer + paths: + items: + type: string + type: array + sub: + type: boolean + user: + type: string + required: + - group + - mode + - paths + - user + type: object + request.FileRoleUpdate: + properties: + group: + type: string + path: + type: string + sub: + type: boolean + user: + type: string + required: + - group + - path + - user + type: object + request.FileWget: + properties: + ignoreCertificate: + type: boolean + name: + type: string + path: + type: string + url: + type: string + required: + - name + - path + - url + type: object + request.HostToolConfig: + properties: + content: + type: string + operate: + enum: + - get + - set + type: string + type: + enum: + - supervisord + type: string + required: + - type + type: object + request.HostToolCreate: + properties: + configPath: + type: string + serviceName: + type: string + type: + type: string + required: + - type + type: object + request.HostToolLogReq: + properties: + type: + enum: + - supervisord + type: string + required: + - type + type: object + request.HostToolReq: + properties: + operate: + enum: + - status + - restart + - start + - stop + type: string + type: + enum: + - supervisord + type: string + required: + - type + type: object + request.NewAppInstall: + properties: + advanced: + type: boolean + allowPort: + type: boolean + appDetailID: + type: integer + containerName: + type: string + cpuQuota: + type: number + dockerCompose: + type: string + editCompose: + type: boolean + hostMode: + type: boolean + memoryLimit: + type: number + memoryUnit: + type: string + name: + type: string + params: + additionalProperties: true + type: object + pullImage: + type: boolean + type: object + request.NginxAntiLeechUpdate: + properties: + blocked: + type: boolean + cache: + type: boolean + cacheTime: + type: integer + cacheUint: + type: string + enable: + type: boolean + extends: + type: string + logEnable: + type: boolean + noneRef: + type: boolean + return: + type: string + serverNames: + items: + type: string + type: array + websiteID: + type: integer + required: + - extends + - return + - websiteID + type: object + request.NginxAuthReq: + properties: + websiteID: + type: integer + required: + - websiteID + type: object + request.NginxAuthUpdate: + properties: + operate: + type: string + password: + type: string + remark: + type: string + username: + type: string + websiteID: + type: integer + required: + - operate + - websiteID + type: object + request.NginxCommonReq: + properties: + websiteID: + type: integer + required: + - websiteID + type: object + request.NginxConfigFileUpdate: + properties: + backup: + type: boolean + content: + type: string + required: + - content + type: object + request.NginxConfigUpdate: + properties: + operate: + enum: + - add + - update + - delete + type: string + params: {} + scope: + $ref: '#/definitions/dto.NginxKey' + websiteId: + type: integer + required: + - operate + type: object + request.NginxProxyUpdate: + properties: + content: + type: string + name: + type: string + websiteID: + type: integer + required: + - content + - name + - websiteID + type: object + request.NginxRedirectReq: + properties: + domains: + items: + type: string + type: array + enable: + type: boolean + keepPath: + type: boolean + name: + type: string + operate: + type: string + path: + type: string + redirect: + type: string + redirectRoot: + type: boolean + target: + type: string + type: + type: string + websiteID: + type: integer + required: + - name + - operate + - redirect + - target + - type + - websiteID + type: object + request.NginxRedirectUpdate: + properties: + content: + type: string + name: + type: string + websiteID: + type: integer + required: + - content + - name + - websiteID + type: object + request.NginxRewriteReq: + properties: + name: + type: string + websiteId: + type: integer + required: + - name + - websiteId + type: object + request.NginxRewriteUpdate: + properties: + content: + type: string + name: + type: string + websiteId: + type: integer + required: + - name + - websiteId + type: object + request.NginxScopeReq: + properties: + scope: + $ref: '#/definitions/dto.NginxKey' + websiteId: + type: integer + required: + - scope + type: object + request.NodeModuleReq: + properties: + ID: + type: integer + required: + - ID + type: object + request.NodePackageReq: + properties: + codeDir: + type: string + type: object + request.PHPExtensionsCreate: + properties: + extensions: + type: string + name: + type: string + required: + - extensions + - name + type: object + request.PHPExtensionsDelete: + properties: + id: + type: integer + required: + - id + type: object + request.PHPExtensionsSearch: + properties: + all: + type: boolean + page: + type: integer + pageSize: + type: integer + required: + - page + - pageSize + type: object + request.PHPExtensionsUpdate: + properties: + extensions: + type: string + id: + type: integer + required: + - extensions + - id + type: object + request.PortUpdate: + properties: + key: + type: string + name: + type: string + port: + type: integer + type: object + request.ProcessReq: + properties: + PID: + type: integer + required: + - PID + type: object + request.RecycleBinReduce: + properties: + from: + type: string + name: + type: string + rName: + type: string + required: + - from + - rName + type: object + request.RuntimeCreate: + properties: + appDetailId: + type: integer + clean: + type: boolean + codeDir: + type: string + exposedPorts: + items: + $ref: '#/definitions/request.ExposedPort' + type: array + image: + type: string + install: + type: boolean + name: + type: string + params: + additionalProperties: true + type: object + port: + type: integer + resource: + type: string + source: + type: string + type: + type: string + version: + type: string + type: object + request.RuntimeDelete: + properties: + forceDelete: + type: boolean + id: + type: integer + type: object + request.RuntimeOperate: + properties: + ID: + type: integer + operate: + type: string + type: object + request.RuntimeSearch: + properties: + name: + type: string + page: + type: integer + pageSize: + type: integer + status: + type: string + type: + type: string + required: + - page + - pageSize + type: object + request.RuntimeUpdate: + properties: + clean: + type: boolean + codeDir: + type: string + exposedPorts: + items: + $ref: '#/definitions/request.ExposedPort' + type: array + id: + type: integer + image: + type: string + install: + type: boolean + name: + type: string + params: + additionalProperties: true + type: object + port: + type: integer + rebuild: + type: boolean + source: + type: string + version: + type: string + type: object + request.SearchUploadWithPage: + properties: + page: + type: integer + pageSize: + type: integer + path: + type: string + required: + - page + - pageSize + - path + type: object + request.SupervisorProcessConfig: + properties: + command: + type: string + dir: + type: string + name: + type: string + numprocs: + type: string + operate: + type: string + user: + type: string + type: object + request.SupervisorProcessFileReq: + properties: + content: + type: string + file: + enum: + - out.log + - err.log + - config + type: string + name: + type: string + operate: + enum: + - get + - clear + - update + type: string + required: + - file + - name + - operate + type: object + request.WebsiteAcmeAccountCreate: + properties: + eabHmacKey: + type: string + eabKid: + type: string + email: + type: string + keyType: + enum: + - P256 + - P384 + - "2048" + - "3072" + - "4096" + - "8192" + type: string + type: + enum: + - letsencrypt + - zerossl + - buypass + - google + type: string + required: + - email + - keyType + - type + type: object + request.WebsiteBatchDelReq: + properties: + ids: + items: + type: integer + type: array + required: + - ids + type: object + request.WebsiteCACreate: + properties: + city: + type: string + commonName: + type: string + country: + type: string + keyType: + enum: + - P256 + - P384 + - "2048" + - "3072" + - "4096" + - "8192" + type: string + name: + type: string + organization: + type: string + organizationUint: + type: string + province: + type: string + required: + - commonName + - country + - keyType + - name + - organization + type: object + request.WebsiteCAObtain: + properties: + autoRenew: + type: boolean + description: + type: string + dir: + type: string + domains: + type: string + execShell: + type: boolean + id: + type: integer + keyType: + enum: + - P256 + - P384 + - "2048" + - "3072" + - "4096" + - "8192" + type: string + pushDir: + type: boolean + renew: + type: boolean + shell: + type: string + sslID: + type: integer + time: + type: integer + unit: + type: string + required: + - domains + - id + - keyType + - time + - unit + type: object + request.WebsiteCASearch: + properties: + page: + type: integer + pageSize: + type: integer + required: + - page + - pageSize + type: object + request.WebsiteCommonReq: + properties: + id: + type: integer + required: + - id + type: object + request.WebsiteCreate: + properties: + IPV6: + type: boolean + alias: + type: string + appID: + type: integer + appInstall: + $ref: '#/definitions/request.NewAppInstall' + appInstallID: + type: integer + appType: + enum: + - new + - installed + type: string + ftpPassword: + type: string + ftpUser: + type: string + otherDomains: + type: string + port: + type: integer + primaryDomain: + type: string + proxy: + type: string + proxyType: + type: string + remark: + type: string + runtimeID: + type: integer + type: + type: string + webSiteGroupID: + type: integer + required: + - alias + - primaryDomain + - type + - webSiteGroupID + type: object + request.WebsiteDNSReq: + properties: + acmeAccountId: + type: integer + domains: + items: + type: string + type: array + required: + - acmeAccountId + - domains + type: object + request.WebsiteDefaultUpdate: + properties: + id: + type: integer + type: object + request.WebsiteDelete: + properties: + deleteApp: + type: boolean + deleteBackup: + type: boolean + forceDelete: + type: boolean + id: + type: integer + required: + - id + type: object + request.WebsiteDnsAccountCreate: + properties: + authorization: + additionalProperties: + type: string + type: object + name: + type: string + type: + type: string + required: + - authorization + - name + - type + type: object + request.WebsiteDnsAccountUpdate: + properties: + authorization: + additionalProperties: + type: string + type: object + id: + type: integer + name: + type: string + type: + type: string + required: + - authorization + - id + - name + - type + type: object + request.WebsiteDomainCreate: + properties: + domains: + type: string + websiteID: + type: integer + required: + - domains + - websiteID + type: object + request.WebsiteDomainDelete: + properties: + id: + type: integer + required: + - id + type: object + request.WebsiteHTTPSOp: + properties: + SSLProtocol: + items: + type: string + type: array + algorithm: + type: string + certificate: + type: string + certificatePath: + type: string + enable: + type: boolean + hsts: + type: boolean + httpConfig: + enum: + - HTTPSOnly + - HTTPAlso + - HTTPToHTTPS + type: string + importType: + type: string + privateKey: + type: string + privateKeyPath: + type: string + type: + enum: + - existed + - auto + - manual + type: string + websiteId: + type: integer + websiteSSLId: + type: integer + required: + - websiteId + type: object + request.WebsiteHtmlUpdate: + properties: + content: + type: string + type: + type: string + required: + - content + - type + type: object + request.WebsiteInstallCheckReq: + properties: + InstallIds: + items: + type: integer + type: array + type: object + request.WebsiteLogReq: + properties: + id: + type: integer + logType: + type: string + operate: + type: string + page: + type: integer + pageSize: + type: integer + required: + - id + - logType + - operate + type: object + request.WebsiteNginxUpdate: + properties: + content: + type: string + id: + type: integer + required: + - content + - id + type: object + request.WebsiteOp: + properties: + id: + type: integer + operate: + type: string + required: + - id + type: object + request.WebsitePHPConfigUpdate: + properties: + disableFunctions: + items: + type: string + type: array + id: + type: integer + params: + additionalProperties: + type: string + type: object + scope: + type: string + uploadMaxSize: + type: string + required: + - id + - scope + type: object + request.WebsitePHPFileUpdate: + properties: + content: + type: string + id: + type: integer + type: + type: string + required: + - content + - id + - type + type: object + request.WebsitePHPVersionReq: + properties: + retainConfig: + type: boolean + runtimeID: + type: integer + websiteID: + type: integer + required: + - runtimeID + - websiteID + type: object + request.WebsiteProxyConfig: + properties: + cache: + type: boolean + cacheTime: + type: integer + cacheUnit: + type: string + content: + type: string + enable: + type: boolean + filePath: + type: string + id: + type: integer + match: + type: string + modifier: + type: string + name: + type: string + operate: + type: string + proxyHost: + type: string + proxyPass: + type: string + replaces: + additionalProperties: + type: string + type: object + sni: + type: boolean + required: + - id + - match + - name + - operate + - proxyHost + - proxyPass + type: object + request.WebsiteProxyReq: + properties: + id: + type: integer + required: + - id + type: object + request.WebsiteResourceReq: + properties: + id: + type: integer + required: + - id + type: object + request.WebsiteSSLApply: + properties: + ID: + type: integer + nameservers: + items: + type: string + type: array + skipDNSCheck: + type: boolean + required: + - ID + type: object + request.WebsiteSSLCreate: + properties: + acmeAccountId: + type: integer + apply: + type: boolean + autoRenew: + type: boolean + description: + type: string + dir: + type: string + disableCNAME: + type: boolean + dnsAccountId: + type: integer + execShell: + type: boolean + id: + type: integer + keyType: + type: string + nameserver1: + type: string + nameserver2: + type: string + otherDomains: + type: string + primaryDomain: + type: string + provider: + type: string + pushDir: + type: boolean + shell: + type: string + skipDNS: + type: boolean + required: + - acmeAccountId + - primaryDomain + - provider + type: object + request.WebsiteSSLSearch: + properties: + acmeAccountID: + type: string + page: + type: integer + pageSize: + type: integer + required: + - page + - pageSize + type: object + request.WebsiteSSLUpdate: + properties: + acmeAccountId: + type: integer + apply: + type: boolean + autoRenew: + type: boolean + description: + type: string + dir: + type: string + disableCNAME: + type: boolean + dnsAccountId: + type: integer + execShell: + type: boolean + id: + type: integer + keyType: + type: string + nameserver1: + type: string + nameserver2: + type: string + otherDomains: + type: string + primaryDomain: + type: string + provider: + type: string + pushDir: + type: boolean + shell: + type: string + skipDNS: + type: boolean + required: + - id + - primaryDomain + - provider + type: object + request.WebsiteSSLUpload: + properties: + certificate: + type: string + certificatePath: + type: string + description: + type: string + privateKey: + type: string + privateKeyPath: + type: string + sslID: + type: integer + type: + enum: + - paste + - local + type: string + required: + - type + type: object + request.WebsiteSearch: + properties: + name: + type: string + order: + enum: + - "null" + - ascending + - descending + type: string + orderBy: + enum: + - primary_domain + - type + - status + - created_at + - expire_date + type: string + page: + type: integer + pageSize: + type: integer + websiteGroupId: + type: integer + required: + - order + - orderBy + - page + - pageSize + type: object + request.WebsiteUpdate: + properties: + IPV6: + type: boolean + expireDate: + type: string + id: + type: integer + primaryDomain: + type: string + remark: + type: string + webSiteGroupID: + type: integer + required: + - id + - primaryDomain + type: object + request.WebsiteUpdateDir: + properties: + id: + type: integer + siteDir: + type: string + required: + - id + - siteDir + type: object + request.WebsiteUpdateDirPermission: + properties: + group: + type: string + id: + type: integer + user: + type: string + required: + - group + - id + - user + type: object + response.AppDTO: + properties: + createdAt: + type: string + crossVersionUpdate: + type: boolean + document: + type: string + github: + type: string + icon: + type: string + id: + type: integer + installed: + type: boolean + key: + type: string + lastModified: + type: integer + limit: + type: integer + name: + type: string + readMe: + type: string + recommend: + type: integer + required: + type: string + resource: + type: string + shortDescEn: + type: string + shortDescZh: + type: string + status: + type: string + tags: + items: + $ref: '#/definitions/model.Tag' + type: array + type: + type: string + updatedAt: + type: string + versions: + items: + type: string + type: array + website: + type: string + type: object + response.AppDetailDTO: + properties: + appId: + type: integer + createdAt: + type: string + dockerCompose: + type: string + downloadCallBackUrl: + type: string + downloadUrl: + type: string + enable: + type: boolean + hostMode: + type: boolean + id: + type: integer + ignoreUpgrade: + type: boolean + image: + type: string + lastModified: + type: integer + lastVersion: + type: string + params: {} + status: + type: string + update: + type: boolean + updatedAt: + type: string + version: + type: string + type: object + response.AppInstalledCheck: + properties: + app: + type: string + appInstallId: + type: integer + containerName: + type: string + createdAt: + type: string + httpPort: + type: integer + httpsPort: + type: integer + installPath: + type: string + isExist: + type: boolean + lastBackupAt: + type: string + name: + type: string + status: + type: string + version: + type: string + type: object + response.AppParam: + properties: + edit: + type: boolean + key: + type: string + labelEn: + type: string + labelZh: + type: string + multiple: + type: boolean + required: + type: boolean + rule: + type: string + showValue: + type: string + type: + type: string + value: {} + values: {} + type: object + response.AppService: + properties: + config: {} + from: + type: string + label: + type: string + value: + type: string + type: object + response.FileInfo: + properties: + content: + type: string + extension: + type: string + favoriteID: + type: integer + gid: + type: string + group: + type: string + isDetail: + type: boolean + isDir: + type: boolean + isHidden: + type: boolean + isSymlink: + type: boolean + itemTotal: + type: integer + items: + items: + $ref: '#/definitions/files.FileInfo' + type: array + linkPath: + type: string + mimeType: + type: string + modTime: + type: string + mode: + type: string + name: + type: string + path: + type: string + size: + type: integer + type: + type: string + uid: + type: string + updateTime: + type: string + user: + type: string + type: object + response.FileTree: + properties: + children: + items: + $ref: '#/definitions/response.FileTree' + type: array + extension: + type: string + id: + type: string + isDir: + type: boolean + name: + type: string + path: + type: string + type: object + response.IgnoredApp: + properties: + detailID: + type: integer + icon: + type: string + name: + type: string + version: + type: string + type: object + response.NginxParam: + properties: + name: + type: string + params: + items: + type: string + type: array + type: object + response.NginxStatus: + properties: + accepts: + type: string + active: + type: string + handled: + type: string + reading: + type: string + requests: + type: string + waiting: + type: string + writing: + type: string + type: object + response.PHPConfig: + properties: + disableFunctions: + items: + type: string + type: array + params: + additionalProperties: + type: string + type: object + uploadMaxSize: + type: string + type: object + response.PHPExtensionsDTO: + properties: + createdAt: + type: string + extensions: + type: string + id: + type: integer + name: + type: string + updatedAt: + type: string + type: object + response.WebsiteAcmeAccountDTO: + properties: + createdAt: + type: string + eabHmacKey: + type: string + eabKid: + type: string + email: + type: string + id: + type: integer + keyType: + type: string + type: + type: string + updatedAt: + type: string + url: + type: string + type: object + response.WebsiteCADTO: + properties: + city: + type: string + commonName: + type: string + country: + type: string + createdAt: + type: string + csr: + type: string + id: + type: integer + keyType: + type: string + name: + type: string + organization: + type: string + organizationUint: + type: string + privateKey: + type: string + province: + type: string + updatedAt: + type: string + type: object + response.WebsiteDNSRes: + properties: + domain: + type: string + err: + type: string + resolve: + type: string + value: + type: string + type: object + response.WebsiteDTO: + properties: + IPV6: + type: boolean + accessLog: + type: boolean + accessLogPath: + type: string + alias: + type: string + appInstallId: + type: integer + appName: + type: string + createdAt: + type: string + defaultServer: + type: boolean + domains: + items: + $ref: '#/definitions/model.WebsiteDomain' + type: array + errorLog: + type: boolean + errorLogPath: + type: string + expireDate: + type: string + ftpId: + type: integer + group: + type: string + httpConfig: + type: string + id: + type: integer + primaryDomain: + type: string + protocol: + type: string + proxy: + type: string + proxyType: + type: string + remark: + type: string + rewrite: + type: string + runtimeID: + type: integer + runtimeName: + type: string + siteDir: + type: string + sitePath: + type: string + status: + type: string + type: + type: string + updatedAt: + type: string + user: + type: string + webSiteGroupId: + type: integer + webSiteSSL: + $ref: '#/definitions/model.WebsiteSSL' + webSiteSSLId: + type: integer + type: object + response.WebsiteHTTPS: + properties: + SSL: + $ref: '#/definitions/model.WebsiteSSL' + SSLProtocol: + items: + type: string + type: array + algorithm: + type: string + enable: + type: boolean + hsts: + type: boolean + httpConfig: + type: string + type: object + response.WebsiteLog: + properties: + content: + type: string + enable: + type: boolean + end: + type: boolean + path: + type: string + type: object + response.WebsiteNginxConfig: + properties: + enable: + type: boolean + params: + items: + $ref: '#/definitions/response.NginxParam' + type: array + type: object + response.WebsitePreInstallCheck: + properties: + appName: + type: string + name: + type: string + status: + type: string + version: + type: string + type: object +host: localhost +info: + contact: {} + description: 开源Linux面板 + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: http://swagger.io/terms/ + title: 1Panel + version: "1.0" +paths: + /apps/:key: + get: + consumes: + - application/json + description: 通过 key 获取应用信息 + parameters: + - description: app key + in: path + name: key + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.AppDTO' + security: + - ApiKeyAuth: [] + summary: Search app by key + tags: + - App + /apps/checkupdate: + get: + description: 获取应用更新版本 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get app list update + tags: + - App + /apps/detail/:appId/:version/:type: + get: + consumes: + - application/json + description: 通过 appid 获取应用详情 + parameters: + - description: app id + in: path + name: appId + required: true + type: integer + - description: app 版本 + in: path + name: version + required: true + type: string + - description: app 类型 + in: path + name: version + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.AppDetailDTO' + security: + - ApiKeyAuth: [] + summary: Search app detail by appid + tags: + - App + /apps/details/:id: + get: + consumes: + - application/json + description: 通过 id 获取应用详情 + parameters: + - description: id + in: path + name: appId + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.AppDetailDTO' + security: + - ApiKeyAuth: [] + summary: Get app detail by id + tags: + - App + /apps/ignored: + get: + consumes: + - application/json + description: 获取忽略的应用版本 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.IgnoredApp' + security: + - ApiKeyAuth: [] + summary: Get Ignore App + tags: + - App + /apps/install: + post: + consumes: + - application/json + description: 安装应用 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppInstallCreate' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/model.AppInstall' + security: + - ApiKeyAuth: [] + summary: Install app + tags: + - App + x-panel-log: + BeforeFunctions: + - db: app_installs + input_column: name + input_value: name + isList: false + output_column: app_id + output_value: appId + - db: apps + info: appId + isList: false + output_column: key + output_value: appKey + bodyKeys: + - name + formatEN: Install app [appKey]-[name] + formatZH: 安装应用 [appKey]-[name] + paramKeys: [] + /apps/installed/check: + post: + consumes: + - application/json + description: 检查应用安装情况 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppInstalledInfo' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.AppInstalledCheck' + security: + - ApiKeyAuth: [] + summary: Check app installed + tags: + - App + /apps/installed/conf: + post: + consumes: + - application/json + description: 通过 key 获取应用默认配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Search default config by key + tags: + - App + /apps/installed/conninfo/:key: + get: + consumes: + - application/json + description: 获取应用连接信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Search app password by key + tags: + - App + /apps/installed/delete/check/:appInstallId: + get: + consumes: + - application/json + description: 删除前检查 + parameters: + - description: App install id + in: path + name: appInstallId + required: true + type: integer + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.AppResource' + type: array + security: + - ApiKeyAuth: [] + summary: Check before delete + tags: + - App + /apps/installed/ignore: + post: + consumes: + - application/json + description: 忽略应用升级版本 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppInstalledIgnoreUpgrade' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: ignore App Update + tags: + - App + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - installId + formatEN: Application param update [installId] + formatZH: 忽略应用 [installId] 版本升级 + paramKeys: [] + /apps/installed/list: + get: + consumes: + - application/json + description: 获取已安装应用列表 + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.AppInstallInfo' + type: array + security: + - ApiKeyAuth: [] + summary: List app installed + tags: + - App + /apps/installed/loadport: + post: + consumes: + - application/json + description: 获取应用端口 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + type: integer + security: + - ApiKeyAuth: [] + summary: Search app port by key + tags: + - App + /apps/installed/op: + post: + consumes: + - application/json + description: 操作已安装应用 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppInstalledOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate installed app + tags: + - App + x-panel-log: + BeforeFunctions: + - db: app_installs + input_column: id + input_value: installId + isList: false + output_column: app_id + output_value: appId + - db: app_installs + input_column: id + input_value: installId + isList: false + output_column: name + output_value: appName + - db: apps + input_column: id + input_value: appId + isList: false + output_column: key + output_value: appKey + bodyKeys: + - installId + - operate + formatEN: '[operate] App [appKey][appName]' + formatZH: '[operate] 应用 [appKey][appName]' + paramKeys: [] + /apps/installed/params/:appInstallId: + get: + consumes: + - application/json + description: 通过 install id 获取应用参数 + parameters: + - description: request + in: path + name: appInstallId + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.AppParam' + security: + - ApiKeyAuth: [] + summary: Search params by appInstallId + tags: + - App + /apps/installed/params/update: + post: + consumes: + - application/json + description: 修改应用参数 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppInstalledUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change app params + tags: + - App + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - installId + formatEN: Application param update [installId] + formatZH: 应用参数修改 [installId] + paramKeys: [] + /apps/installed/port/change: + post: + consumes: + - application/json + description: 修改应用端口 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.PortUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change app port + tags: + - App + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - name + - port + formatEN: Application port update [key]-[name] => [port] + formatZH: 应用端口修改 [key]-[name] => [port] + paramKeys: [] + /apps/installed/search: + post: + consumes: + - application/json + description: 分页获取已安装应用列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppInstalledSearch' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Page app installed + tags: + - App + /apps/installed/sync: + post: + description: 同步已安装应用列表 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Sync app installed + tags: + - App + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Sync the list of installed apps + formatZH: 同步已安装应用列表 + paramKeys: [] + /apps/installed/update/versions: + post: + consumes: + - application/json + description: 通过 install id 获取应用更新版本 + parameters: + - description: request + in: path + name: appInstallId + required: true + type: integer + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.AppVersion' + type: array + security: + - ApiKeyAuth: [] + summary: Search app update version by install id + tags: + - App + /apps/search: + post: + consumes: + - application/json + description: 获取应用列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.AppSearch' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: List apps + tags: + - App + /apps/services/:key: + get: + consumes: + - application/json + description: 通过 key 获取应用 service + parameters: + - description: request + in: path + name: key + required: true + type: string + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.AppService' + type: array + security: + - ApiKeyAuth: [] + summary: Search app service by key + tags: + - App + /apps/sync: + post: + description: 同步应用列表 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Sync app list + tags: + - App + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: App store synchronization + formatZH: 应用商店同步 + paramKeys: [] + /auth/captcha: + get: + description: 加载验证码 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.CaptchaResponse' + summary: Load captcha + tags: + - Auth + /auth/demo: + get: + description: 判断是否为demo环境 + responses: + "200": + description: OK + summary: Check System isDemo + tags: + - Auth + /auth/issafety: + get: + description: 获取系统安全登录状态 + responses: + "200": + description: OK + summary: Load safety status + tags: + - Auth + /auth/language: + get: + description: 获取系统语言设置 + responses: + "200": + description: OK + summary: Load System Language + tags: + - Auth + /auth/login: + post: + consumes: + - application/json + description: 用户登录 + parameters: + - description: 安全入口 base64 加密串 + in: header + name: EntranceCode + required: true + type: string + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Login' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.UserLoginInfo' + summary: User login + tags: + - Auth + /auth/logout: + post: + description: 用户登出 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: User logout + tags: + - Auth + /auth/mfalogin: + post: + consumes: + - application/json + description: 用户 mfa 登录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MFALogin' + responses: + "200": + description: OK + headers: + EntranceCode: + description: 安全入口 + type: string + schema: + $ref: '#/definitions/dto.UserLoginInfo' + summary: User login with mfa + tags: + - Auth + /containers: + post: + consumes: + - application/json + description: 创建容器 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create container + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - image + formatEN: create container [name][image] + formatZH: 创建容器 [name][image] + paramKeys: [] + /containers/clean/log: + post: + consumes: + - application/json + description: 清理容器日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithName' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Clean container log + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: clean container [name] logs + formatZH: 清理容器 [name] 日志 + paramKeys: [] + /containers/commit: + post: + consumes: + - application/json + description: 容器提交生成新镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerCommit' + responses: + "200": + description: OK + summary: Commit Container + tags: + - Container + /containers/compose: + post: + consumes: + - application/json + description: 创建容器编排 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ComposeCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create compose + tags: + - Container Compose + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create compose [name] + formatZH: 创建 compose [name] + paramKeys: [] + /containers/compose/operate: + post: + consumes: + - application/json + description: 容器编排操作 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ComposeOperation' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate compose + tags: + - Container Compose + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - operation + formatEN: compose [operation] [name] + formatZH: compose [operation] [name] + paramKeys: [] + /containers/compose/search: + post: + consumes: + - application/json + description: 获取编排列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page composes + tags: + - Container Compose + /containers/compose/search/log: + get: + description: docker-compose 日志 + parameters: + - description: compose 文件地址 + in: query + name: compose + type: string + - description: 时间筛选 + in: query + name: since + type: string + - description: 是否追踪 + in: query + name: follow + type: string + - description: 显示行号 + in: query + name: tail + type: string + responses: {} + security: + - ApiKeyAuth: [] + summary: Container Compose logs + tags: + - Container Compose + /containers/compose/test: + post: + consumes: + - application/json + description: 测试 compose 是否可用 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ComposeCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Test compose + tags: + - Container Compose + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: check compose [name] + formatZH: 检测 compose [name] 格式 + paramKeys: [] + /containers/compose/update: + post: + consumes: + - application/json + description: 更新容器编排 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ComposeUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update compose + tags: + - Container Compose + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: update compose information [name] + formatZH: 更新 compose [name] + paramKeys: [] + /containers/daemonjson: + get: + description: 获取 docker 配置信息 + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.DaemonJsonConf' + security: + - ApiKeyAuth: [] + summary: Load docker daemon.json + tags: + - Container Docker + /containers/daemonjson/file: + get: + description: 获取 docker 配置信息(表单) + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Load docker daemon.json + tags: + - Container Docker + /containers/daemonjson/update: + post: + consumes: + - application/json + description: 修改 docker 配置信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SettingUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update docker daemon.json + tags: + - Container Docker + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - value + formatEN: Updated configuration [key] + formatZH: 更新配置 [key] + paramKeys: [] + /containers/daemonjson/update/byfile: + post: + consumes: + - application/json + description: 上传替换 docker 配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DaemonJsonUpdateByFile' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update docker daemon.json by upload file + tags: + - Container Docker + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Updated configuration file + formatZH: 更新配置文件 + paramKeys: [] + /containers/docker/operate: + post: + consumes: + - application/json + description: Docker 操作 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DockerOperation' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate docker + tags: + - Container Docker + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operation + formatEN: '[operation] docker service' + formatZH: docker 服务 [operation] + paramKeys: [] + /containers/docker/status: + get: + description: 获取 docker 服务状态 + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Load docker status + tags: + - Container Docker + /containers/download/log: + post: + description: 下载容器日志 + responses: {} + /containers/image: + get: + description: 获取镜像名称列表 + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.Options' + type: array + security: + - ApiKeyAuth: [] + summary: load images options + tags: + - Container Image + /containers/image/all: + get: + description: 获取所有镜像列表 + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.ImageInfo' + type: array + security: + - ApiKeyAuth: [] + summary: List all images + tags: + - Container Image + /containers/image/build: + post: + consumes: + - application/json + description: 构建镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageBuild' + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Build image + tags: + - Container Image + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: build image [name] + formatZH: 构建镜像 [name] + paramKeys: [] + /containers/image/load: + post: + consumes: + - application/json + description: 导入镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageLoad' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load image + tags: + - Container Image + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: load image from [path] + formatZH: 从 [path] 加载镜像 + paramKeys: [] + /containers/image/pull: + post: + consumes: + - application/json + description: 拉取镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImagePull' + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Pull image + tags: + - Container Image + x-panel-log: + BeforeFunctions: + - db: image_repos + input_column: id + input_value: repoID + isList: false + output_column: name + output_value: reponame + bodyKeys: + - repoID + - imageName + formatEN: image pull [reponame][imageName] + formatZH: 镜像拉取 [reponame][imageName] + paramKeys: [] + /containers/image/push: + post: + consumes: + - application/json + description: 推送镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImagePush' + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Push image + tags: + - Container Image + x-panel-log: + BeforeFunctions: + - db: image_repos + input_column: id + input_value: repoID + isList: false + output_column: name + output_value: reponame + bodyKeys: + - repoID + - tagName + - name + formatEN: push [tagName] to [reponame][name] + formatZH: '[tagName] 推送到 [reponame][name]' + paramKeys: [] + /containers/image/remove: + post: + consumes: + - application/json + description: 删除镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete image + tags: + - Container Image + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - names + formatEN: remove image [names] + formatZH: 移除镜像 [names] + paramKeys: [] + /containers/image/save: + post: + consumes: + - application/json + description: 导出镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageSave' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Save image + tags: + - Container Image + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - tagName + - path + - name + formatEN: save [tagName] as [path]/[name] + formatZH: 保留 [tagName] 为 [path]/[name] + paramKeys: [] + /containers/image/search: + post: + consumes: + - application/json + description: 获取镜像列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page images + tags: + - Container Image + /containers/image/tag: + post: + consumes: + - application/json + description: Tag 镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageTag' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Tag image + tags: + - Container Image + x-panel-log: + BeforeFunctions: + - db: image_repos + input_column: id + input_value: repoID + isList: false + output_column: name + output_value: reponame + bodyKeys: + - repoID + - targetName + formatEN: tag image [reponame][targetName] + formatZH: tag 镜像 [reponame][targetName] + paramKeys: [] + /containers/info: + post: + consumes: + - application/json + description: 获取容器表单信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithName' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ContainerOperate' + security: + - ApiKeyAuth: [] + summary: Load container info + tags: + - Container + /containers/inspect: + post: + consumes: + - application/json + description: 容器详情 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.InspectReq' + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Container inspect + tags: + - Container + /containers/ipv6option/update: + post: + consumes: + - application/json + description: 修改 docker ipv6 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.LogOption' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update docker daemon.json ipv6 option + tags: + - Container Docker + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Updated the ipv6 option + formatZH: 更新 ipv6 配置 + paramKeys: [] + /containers/limit: + get: + description: 获取容器限制 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ResourceLimit' + security: + - ApiKeyAuth: [] + summary: Load container limits + /containers/list: + post: + consumes: + - application/json + description: 获取容器名称 + produces: + - application/json + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: List containers + tags: + - Container + /containers/list/stats: + get: + description: 获取容器列表资源占用 + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.ContainerListStats' + type: array + security: + - ApiKeyAuth: [] + summary: Load container stats + /containers/load/log: + post: + consumes: + - application/json + description: 获取容器操作日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load container log + tags: + - Container + /containers/logoption/update: + post: + consumes: + - application/json + description: 修改 docker 日志配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.LogOption' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update docker daemon.json log option + tags: + - Container Docker + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Updated the log option + formatZH: 更新日志配置 + paramKeys: [] + /containers/network: + get: + consumes: + - application/json + description: 获取容器网络列表 + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.Options' + type: array + security: + - ApiKeyAuth: [] + summary: List networks + tags: + - Container Network + post: + consumes: + - application/json + description: 创建容器网络 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.NetworkCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create network + tags: + - Container Network + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create container network [name] + formatZH: 创建容器网络 name + paramKeys: [] + /containers/network/del: + post: + consumes: + - application/json + description: 删除容器网络 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete network + tags: + - Container Network + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - names + formatEN: delete container network [names] + formatZH: 删除容器网络 [names] + paramKeys: [] + /containers/network/search: + post: + consumes: + - application/json + description: 获取容器网络列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page networks + tags: + - Container Network + /containers/operate: + post: + consumes: + - application/json + description: 容器操作 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerOperation' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate Container + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - names + - operation + formatEN: container [operation] [names] + formatZH: 容器 [names] 执行 [operation] + paramKeys: [] + /containers/prune: + post: + consumes: + - application/json + description: 容器清理 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerPrune' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ContainerPruneReport' + security: + - ApiKeyAuth: [] + summary: Clean container + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - pruneType + formatEN: clean container [pruneType] + formatZH: 清理容器 [pruneType] + paramKeys: [] + /containers/rename: + post: + consumes: + - application/json + description: 容器重命名 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerRename' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Rename Container + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - newName + formatEN: rename container [name] => [newName] + formatZH: 容器重命名 [name] => [newName] + paramKeys: [] + /containers/repo: + get: + description: 获取镜像仓库列表 + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.ImageRepoOption' + type: array + security: + - ApiKeyAuth: [] + summary: List image repos + tags: + - Container Image-repo + post: + consumes: + - application/json + description: 创建镜像仓库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageRepoDelete' + produces: + - application/json + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create image repo + tags: + - Container Image-repo + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create image repo [name] + formatZH: 创建镜像仓库 [name] + paramKeys: [] + /containers/repo/del: + post: + consumes: + - application/json + description: 删除镜像仓库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageRepoDelete' + produces: + - application/json + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete image repo + tags: + - Container Image-repo + x-panel-log: + BeforeFunctions: + - db: image_repos + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete image repo [names] + formatZH: 删除镜像仓库 [names] + paramKeys: [] + /containers/repo/search: + post: + consumes: + - application/json + description: 获取镜像仓库列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page image repos + tags: + - Container Image-repo + /containers/repo/status: + get: + consumes: + - application/json + description: 获取 docker 仓库状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + produces: + - application/json + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load repo status + tags: + - Container Image-repo + /containers/repo/update: + post: + consumes: + - application/json + description: 更新镜像仓库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ImageRepoUpdate' + produces: + - application/json + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update image repo + tags: + - Container Image-repo + x-panel-log: + BeforeFunctions: + - db: image_repos + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: update image repo information [name] + formatZH: 更新镜像仓库 [name] + paramKeys: [] + /containers/search: + post: + consumes: + - application/json + description: 获取容器列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageContainer' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page containers + tags: + - Container + /containers/search/log: + post: + description: 容器日志 + parameters: + - description: 容器名称 + in: query + name: container + type: string + - description: 时间筛选 + in: query + name: since + type: string + - description: 是否追踪 + in: query + name: follow + type: string + - description: 显示行号 + in: query + name: tail + type: string + responses: {} + security: + - ApiKeyAuth: [] + summary: Container logs + tags: + - Container + /containers/stats/:id: + get: + description: 容器监控信息 + parameters: + - description: 容器id + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ContainerStats' + security: + - ApiKeyAuth: [] + summary: Container stats + tags: + - Container + /containers/template: + get: + description: 获取容器编排模版列表 + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.ComposeTemplateInfo' + type: array + security: + - ApiKeyAuth: [] + summary: List compose templates + tags: + - Container Compose-template + post: + consumes: + - application/json + description: 创建容器编排模版 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ComposeTemplateCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create compose template + tags: + - Container Compose-template + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create compose template [name] + formatZH: 创建 compose 模版 [name] + paramKeys: [] + /containers/template/del: + post: + consumes: + - application/json + description: 删除容器编排模版 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete compose template + tags: + - Container Compose-template + x-panel-log: + BeforeFunctions: + - db: compose_templates + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete compose template [names] + formatZH: 删除 compose 模版 [names] + paramKeys: [] + /containers/template/search: + post: + consumes: + - application/json + description: 获取容器编排模版列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page compose templates + tags: + - Container Compose-template + /containers/template/update: + post: + consumes: + - application/json + description: 更新容器编排模版 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ComposeTemplateUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update compose template + tags: + - Container Compose-template + x-panel-log: + BeforeFunctions: + - db: compose_templates + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: update compose template information [name] + formatZH: 更新 compose 模版 [name] + paramKeys: [] + /containers/update: + post: + consumes: + - application/json + description: 更新容器 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update container + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - image + formatEN: update container [name][image] + formatZH: 更新容器 [name][image] + paramKeys: [] + /containers/upgrade: + post: + consumes: + - application/json + description: 更新容器镜像 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ContainerUpgrade' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Upgrade container + tags: + - Container + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - image + formatEN: upgrade container image [name][image] + formatZH: 更新容器镜像 [name][image] + paramKeys: [] + /containers/volume: + get: + consumes: + - application/json + description: 获取容器存储卷列表 + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.Options' + type: array + security: + - ApiKeyAuth: [] + summary: List volumes + tags: + - Container Volume + post: + consumes: + - application/json + description: 创建容器存储卷 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.VolumeCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create volume + tags: + - Container Volume + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create container volume [name] + formatZH: 创建容器存储卷 [name] + paramKeys: [] + /containers/volume/del: + post: + consumes: + - application/json + description: 删除容器存储卷 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete volume + tags: + - Container Volume + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - names + formatEN: delete container volume [names] + formatZH: 删除容器存储卷 [names] + paramKeys: [] + /containers/volume/search: + post: + consumes: + - application/json + description: 获取容器存储卷分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page volumes + tags: + - Container Volume + /cronjobs: + post: + consumes: + - application/json + description: 创建计划任务 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CronjobCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create cronjob + tags: + - Cronjob + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + - name + formatEN: create cronjob [type][name] + formatZH: 创建计划任务 [type][name] + paramKeys: [] + /cronjobs/del: + post: + consumes: + - application/json + description: 删除计划任务 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CronjobBatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete cronjob + tags: + - Cronjob + x-panel-log: + BeforeFunctions: + - db: cronjobs + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete cronjob [names] + formatZH: 删除计划任务 [names] + paramKeys: [] + /cronjobs/download: + post: + consumes: + - application/json + description: 下载计划任务记录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CronjobDownload' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Download cronjob records + tags: + - Cronjob + x-panel-log: + BeforeFunctions: + - db: job_records + input_column: id + input_value: recordID + isList: false + output_column: file + output_value: file + bodyKeys: + - recordID + formatEN: download the cronjob record [file] + formatZH: 下载计划任务记录 [file] + paramKeys: [] + /cronjobs/handle: + post: + consumes: + - application/json + description: 手动执行计划任务 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Handle cronjob once + tags: + - Cronjob + x-panel-log: + BeforeFunctions: + - db: cronjobs + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: manually execute the cronjob [name] + formatZH: 手动执行计划任务 [name] + paramKeys: [] + /cronjobs/records/clean: + post: + consumes: + - application/json + description: 清空计划任务记录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CronjobClean' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Clean job records + tags: + - Cronjob + x-panel-log: + BeforeFunctions: + - db: cronjobs + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: clean cronjob [name] records + formatZH: 清空计划任务记录 [name] + paramKeys: [] + /cronjobs/records/log: + post: + consumes: + - application/json + description: 获取计划任务记录日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load Cronjob record log + tags: + - Cronjob + /cronjobs/search: + post: + consumes: + - application/json + description: 获取计划任务分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageCronjob' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page cronjobs + tags: + - Cronjob + /cronjobs/search/records: + post: + consumes: + - application/json + description: 获取计划任务记录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchRecord' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page job records + tags: + - Cronjob + /cronjobs/status: + post: + consumes: + - application/json + description: 更新计划任务状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CronjobUpdateStatus' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update cronjob status + tags: + - Cronjob + x-panel-log: + BeforeFunctions: + - db: cronjobs + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + - status + formatEN: change the status of cronjob [name] to [status]. + formatZH: 修改计划任务 [name] 状态为 [status] + paramKeys: [] + /cronjobs/update: + post: + consumes: + - application/json + description: 更新计划任务 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CronjobUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update cronjob + tags: + - Cronjob + x-panel-log: + BeforeFunctions: + - db: cronjobs + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: update cronjob [name] + formatZH: 更新计划任务 [name] + paramKeys: [] + /dashboard/base/:ioOption/:netOption: + get: + consumes: + - application/json + description: 获取首页基础数据 + parameters: + - description: request + in: path + name: ioOption + required: true + type: string + - description: request + in: path + name: netOption + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.DashboardBase' + security: + - ApiKeyAuth: [] + summary: Load dashboard base info + tags: + - Dashboard + /dashboard/base/os: + get: + consumes: + - application/json + description: 获取服务器基础数据 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.OsInfo' + security: + - ApiKeyAuth: [] + summary: Load os info + tags: + - Dashboard + /dashboard/current/:ioOption/:netOption: + get: + consumes: + - application/json + description: 获取首页实时数据 + parameters: + - description: request + in: path + name: ioOption + required: true + type: string + - description: request + in: path + name: netOption + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.DashboardCurrent' + security: + - ApiKeyAuth: [] + summary: Load dashboard current info + tags: + - Dashboard + /dashboard/system/restart/:operation: + post: + consumes: + - application/json + description: 重启服务器/面板 + parameters: + - description: request + in: path + name: operation + required: true + type: string + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: System restart + tags: + - Dashboard + /databases: + post: + consumes: + - application/json + description: 创建 mysql 数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MysqlDBCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create mysql database + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create mysql database [name] + formatZH: 创建 mysql 数据库 [name] + paramKeys: [] + /databases/bind: + post: + consumes: + - application/json + description: 绑定 mysql 数据库用户 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BindUser' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Bind user of mysql database + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - database + - username + formatEN: bind mysql database [database] [username] + formatZH: 绑定 mysql 数据库名 [database] [username] + paramKeys: [] + /databases/change/access: + post: + consumes: + - application/json + description: 修改 mysql 访问权限 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangeDBInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change mysql access + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: + - db: database_mysqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Update database [name] access + formatZH: 更新数据库 [name] 访问权限 + paramKeys: [] + /databases/change/password: + post: + consumes: + - application/json + description: 修改 mysql 密码 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangeDBInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change mysql password + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: + - db: database_mysqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Update database [name] password + formatZH: 更新数据库 [name] 密码 + paramKeys: [] + /databases/common/info: + post: + consumes: + - application/json + description: 获取数据库基础信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.DBBaseInfo' + security: + - ApiKeyAuth: [] + summary: Load base info + tags: + - Database Common + /databases/common/load/file: + post: + consumes: + - application/json + description: 获取数据库配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load Database conf + tags: + - Database Common + /databases/common/update/conf: + post: + consumes: + - application/json + description: 上传替换配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DBConfUpdateByFile' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update conf by upload file + tags: + - Database Common + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + - database + formatEN: update the [type] [database] database configuration information + formatZH: 更新 [type] 数据库 [database] 配置信息 + paramKeys: [] + /databases/db: + post: + consumes: + - application/json + description: 创建远程数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DatabaseCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create database + tags: + - Database + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - type + formatEN: create database [name][type] + formatZH: 创建远程数据库 [name][type] + paramKeys: [] + /databases/db/:name: + get: + description: 获取远程数据库 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.DatabaseInfo' + security: + - ApiKeyAuth: [] + summary: Get databases + tags: + - Database + /databases/db/check: + post: + consumes: + - application/json + description: 检测远程数据库连接性 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DatabaseCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Check database + tags: + - Database + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - type + formatEN: check if database [name][type] is connectable + formatZH: 检测远程数据库 [name][type] 连接性 + paramKeys: [] + /databases/db/del: + post: + consumes: + - application/json + description: 删除远程数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DatabaseDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete database + tags: + - Database + x-panel-log: + BeforeFunctions: + - db: databases + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete database [names] + formatZH: 删除远程数据库 [names] + paramKeys: [] + /databases/db/item/:type: + get: + description: 获取数据库列表 + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.DatabaseItem' + type: array + security: + - ApiKeyAuth: [] + summary: List databases + tags: + - Database + /databases/db/list/:type: + get: + description: 获取远程数据库列表 + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.DatabaseOption' + type: array + security: + - ApiKeyAuth: [] + summary: List databases + tags: + - Database + /databases/db/search: + post: + consumes: + - application/json + description: 获取远程数据库列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DatabaseSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page databases + tags: + - Database + /databases/db/update: + post: + consumes: + - application/json + description: 更新远程数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DatabaseUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update database + tags: + - Database + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: update database [name] + formatZH: 更新远程数据库 [name] + paramKeys: [] + /databases/del: + post: + consumes: + - application/json + description: 删除 mysql 数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MysqlDBDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete mysql database + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: + - db: database_mysqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: delete mysql database [name] + formatZH: 删除 mysql 数据库 [name] + paramKeys: [] + /databases/del/check: + post: + consumes: + - application/json + description: Mysql 数据库删除前检查 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MysqlDBDeleteCheck' + responses: + "200": + description: OK + schema: + items: + type: string + type: array + security: + - ApiKeyAuth: [] + summary: Check before delete mysql database + tags: + - Database Mysql + /databases/description/update: + post: + consumes: + - application/json + description: 更新 mysql 数据库库描述信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateDescription' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update mysql database description + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: + - db: database_mysqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + - description + formatEN: The description of the mysql database [name] is modified => [description] + formatZH: mysql 数据库 [name] 描述信息修改 [description] + paramKeys: [] + /databases/load: + post: + consumes: + - application/json + description: 从服务器获取 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MysqlLoadDB' + responses: {} + security: + - ApiKeyAuth: [] + summary: Load mysql database from remote + tags: + - Database Mysql + /databases/options: + get: + consumes: + - application/json + description: 获取 mysql 数据库列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageInfo' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.MysqlOption' + type: array + security: + - ApiKeyAuth: [] + summary: List mysql database names + tags: + - Database Mysql + /databases/pg: + post: + consumes: + - application/json + description: 创建 postgresql 数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PostgresqlDBCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create postgresql database + tags: + - Database Postgresql + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: create postgresql database [name] + formatZH: 创建 postgresql 数据库 [name] + paramKeys: [] + /databases/pg/:database/load: + post: + consumes: + - application/json + description: 从服务器获取 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PostgresqlLoadDB' + responses: {} + security: + - ApiKeyAuth: [] + summary: Load postgresql database from remote + tags: + - Database Postgresql + /databases/pg/bind: + post: + consumes: + - application/json + description: 绑定 postgresql 数据库用户 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PostgresqlBindUser' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Bind postgresql user + tags: + - Database Postgresql + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - username + formatEN: bind postgresql database [name] user [username] + formatZH: 绑定 postgresql 数据库 [name] 用户 [username] + paramKeys: [] + /databases/pg/del: + post: + consumes: + - application/json + description: 删除 postgresql 数据库 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PostgresqlDBDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete postgresql database + tags: + - Database Postgresql + x-panel-log: + BeforeFunctions: + - db: database_postgresqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: delete postgresql database [name] + formatZH: 删除 postgresql 数据库 [name] + paramKeys: [] + /databases/pg/del/check: + post: + consumes: + - application/json + description: Postgresql 数据库删除前检查 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PostgresqlDBDeleteCheck' + responses: + "200": + description: OK + schema: + items: + type: string + type: array + security: + - ApiKeyAuth: [] + summary: Check before delete postgresql database + tags: + - Database Postgresql + /databases/pg/description: + post: + consumes: + - application/json + description: 更新 postgresql 数据库库描述信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateDescription' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update postgresql database description + tags: + - Database Postgresql + x-panel-log: + BeforeFunctions: + - db: database_postgresqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + - description + formatEN: The description of the postgresql database [name] is modified => + [description] + formatZH: postgresql 数据库 [name] 描述信息修改 [description] + paramKeys: [] + /databases/pg/password: + post: + consumes: + - application/json + description: 修改 postgresql 密码 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangeDBInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change postgresql password + tags: + - Database Postgresql + x-panel-log: + BeforeFunctions: + - db: database_postgresqls + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Update database [name] password + formatZH: 更新数据库 [name] 密码 + paramKeys: [] + /databases/pg/privileges: + post: + consumes: + - application/json + description: 修改 postgresql 用户权限 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangeDBInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change postgresql privileges + tags: + - Database Postgresql + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - database + - username + formatEN: Update [user] privileges of database [database] + formatZH: 更新数据库 [database] 用户 [username] 权限 + paramKeys: [] + /databases/pg/search: + post: + consumes: + - application/json + description: 获取 postgresql 数据库列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PostgresqlDBSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page postgresql databases + tags: + - Database Postgresql + /databases/redis/conf: + post: + consumes: + - application/json + description: 获取 redis 配置信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithName' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.RedisConf' + security: + - ApiKeyAuth: [] + summary: Load redis conf + tags: + - Database Redis + /databases/redis/conf/update: + post: + consumes: + - application/json + description: 更新 redis 配置信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.RedisConfUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update redis conf + tags: + - Database Redis + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: update the redis database configuration information + formatZH: 更新 redis 数据库配置信息 + paramKeys: [] + /databases/redis/install/cli: + post: + description: 安装 redis cli + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Install redis-cli + tags: + - Database Redis + /databases/redis/password: + post: + consumes: + - application/json + description: 更新 redis 密码 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangeRedisPass' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change redis password + tags: + - Database Redis + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: change the password of the redis database + formatZH: 修改 redis 数据库密码 + paramKeys: [] + /databases/redis/persistence/conf: + post: + consumes: + - application/json + description: 获取 redis 持久化配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithName' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.RedisPersistence' + security: + - ApiKeyAuth: [] + summary: Load redis persistence conf + tags: + - Database Redis + /databases/redis/persistence/update: + post: + consumes: + - application/json + description: 更新 redis 持久化配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.RedisConfPersistenceUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update redis persistence conf + tags: + - Database Redis + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: redis database persistence configuration update + formatZH: redis 数据库持久化配置更新 + paramKeys: [] + /databases/redis/status: + post: + consumes: + - application/json + description: 获取 redis 状态信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithName' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.RedisStatus' + security: + - ApiKeyAuth: [] + summary: Load redis status info + tags: + - Database Redis + /databases/remote: + post: + consumes: + - application/json + description: 获取 mysql 远程访问权限 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + type: boolean + security: + - ApiKeyAuth: [] + summary: Load mysql remote access + tags: + - Database Mysql + /databases/search: + post: + consumes: + - application/json + description: 获取 mysql 数据库列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MysqlDBSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page mysql databases + tags: + - Database Mysql + /databases/status: + post: + consumes: + - application/json + description: 获取 mysql 状态信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.MysqlStatus' + security: + - ApiKeyAuth: [] + summary: Load mysql status info + tags: + - Database Mysql + /databases/variables: + post: + consumes: + - application/json + description: 获取 mysql 性能参数信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithNameAndType' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.MysqlVariables' + security: + - ApiKeyAuth: [] + summary: Load mysql variables info + tags: + - Database Mysql + /databases/variables/update: + post: + consumes: + - application/json + description: mysql 性能调优 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MysqlVariablesUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update mysql variables + tags: + - Database Mysql + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: adjust mysql database performance parameters + formatZH: 调整 mysql 数据库性能参数 + paramKeys: [] + /db/remote/del/check: + post: + consumes: + - application/json + description: Mysql 远程数据库删除前检查 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + schema: + items: + type: string + type: array + security: + - ApiKeyAuth: [] + summary: Check before delete remote database + tags: + - Database + /files: + post: + consumes: + - application/json + description: 创建文件/文件夹 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Create dir or file [path] + formatZH: 创建文件/文件夹 [path] + paramKeys: [] + /files/batch/del: + post: + consumes: + - application/json + description: 批量删除文件/文件夹 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileBatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Batch delete file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - paths + formatEN: Batch delete dir or file [paths] + formatZH: 批量删除文件/文件夹 [paths] + paramKeys: [] + /files/batch/role: + post: + consumes: + - application/json + description: 批量修改文件权限和用户/组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileRoleReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Batch change file mode and owner + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - paths + - mode + - user + - group + formatEN: Batch change file mode and owner [paths] => [mode]/[user]/[group] + formatZH: 批量修改文件权限和用户/组 [paths] => [mode]/[user]/[group] + paramKeys: [] + /files/check: + post: + consumes: + - application/json + description: 检测文件是否存在 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FilePathCheck' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Check file exist + tags: + - File + /files/chunkdownload: + post: + consumes: + - application/json + description: 分片下载下载文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileDownload' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Chunk Download file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Download file [name] + formatZH: 下载文件 [name] + paramKeys: [] + /files/chunkupload: + post: + description: 分片上传文件 + parameters: + - description: request + in: formData + name: file + required: true + type: file + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: ChunkUpload file + tags: + - File + /files/compress: + post: + consumes: + - application/json + description: 压缩文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileCompress' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Compress file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Compress file [name] + formatZH: 压缩文件 [name] + paramKeys: [] + /files/content: + post: + consumes: + - application/json + description: 获取文件内容 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileContentReq' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.FileInfo' + security: + - ApiKeyAuth: [] + summary: Load file content + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Load file content [path] + formatZH: 获取文件内容 [path] + paramKeys: [] + /files/decompress: + post: + consumes: + - application/json + description: 解压文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileDeCompress' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Decompress file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Decompress file [path] + formatZH: 解压 [path] + paramKeys: [] + /files/del: + post: + consumes: + - application/json + description: 删除文件/文件夹 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Delete dir or file [path] + formatZH: 删除文件/文件夹 [path] + paramKeys: [] + /files/download: + get: + consumes: + - application/json + description: 下载文件 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Download file + tags: + - File + /files/favorite: + post: + consumes: + - application/json + description: 创建收藏 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FavoriteCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create favorite + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: 收藏文件/文件夹 [path] + formatZH: 收藏文件/文件夹 [path] + paramKeys: [] + /files/favorite/del: + post: + consumes: + - application/json + description: 删除收藏 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FavoriteDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete favorite + tags: + - File + x-panel-log: + BeforeFunctions: + - db: favorites + input_column: id + input_value: id + isList: false + output_column: path + output_value: path + bodyKeys: + - id + formatEN: delete avorite [path] + formatZH: 删除收藏 [path] + paramKeys: [] + /files/favorite/search: + post: + consumes: + - application/json + description: 获取收藏列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: List favorites + tags: + - File + /files/mode: + post: + consumes: + - application/json + description: 修改文件权限 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change file mode + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + - mode + formatEN: Change mode [paths] => [mode] + formatZH: 修改权限 [paths] => [mode] + paramKeys: [] + /files/move: + post: + consumes: + - application/json + description: 移动文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileMove' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Move file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - oldPaths + - newPath + formatEN: Move [oldPaths] => [newPath] + formatZH: 移动文件 [oldPaths] => [newPath] + paramKeys: [] + /files/owner: + post: + consumes: + - application/json + description: 修改文件用户/组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileRoleUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change file owner + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + - user + - group + formatEN: Change owner [paths] => [user]/[group] + formatZH: 修改用户/组 [paths] => [user]/[group] + paramKeys: [] + /files/read: + post: + description: 按行读取日志文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileReadByLineReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Read file by Line + tags: + - File + /files/recycle/clear: + post: + consumes: + - application/json + description: 清空回收站文件 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Clear RecycleBin files + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: 清空回收站 + formatZH: 清空回收站 + paramKeys: [] + /files/recycle/reduce: + post: + consumes: + - application/json + description: 还原回收站文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.RecycleBinReduce' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Reduce RecycleBin files + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Reduce RecycleBin file [name] + formatZH: 还原回收站文件 [name] + paramKeys: [] + /files/recycle/search: + post: + consumes: + - application/json + description: 获取回收站文件列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: List RecycleBin files + tags: + - File + /files/recycle/status: + get: + consumes: + - application/json + description: 获取回收站状态 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get RecycleBin status + tags: + - File + /files/rename: + post: + consumes: + - application/json + description: 修改文件名称 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileRename' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change file name + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - oldName + - newName + formatEN: Rename [oldName] => [newName] + formatZH: 重命名 [oldName] => [newName] + paramKeys: [] + /files/save: + post: + consumes: + - application/json + description: 更新文件内容 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileEdit' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update file content + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Update file content [path] + formatZH: 更新文件内容 [path] + paramKeys: [] + /files/search: + post: + consumes: + - application/json + description: 获取文件列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileOption' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.FileInfo' + security: + - ApiKeyAuth: [] + summary: List files + tags: + - File + /files/size: + post: + consumes: + - application/json + description: 获取文件夹大小 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.DirSizeReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load file size + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Load file size [path] + formatZH: 获取文件夹大小 [path] + paramKeys: [] + /files/tree: + post: + consumes: + - application/json + description: 加载文件树 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileOption' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.FileTree' + type: array + security: + - ApiKeyAuth: [] + summary: Load files tree + tags: + - File + /files/upload: + post: + description: 上传文件 + parameters: + - description: request + in: formData + name: file + required: true + type: file + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Upload file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - path + formatEN: Upload file [path] + formatZH: 上传文件 [path] + paramKeys: [] + /files/upload/search: + post: + consumes: + - application/json + description: 分页获取上传文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.SearchUploadWithPage' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.FileInfo' + type: array + security: + - ApiKeyAuth: [] + summary: Page file + tags: + - File + /files/wget: + post: + consumes: + - application/json + description: 下载远端文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.FileWget' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Wget file + tags: + - File + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - url + - path + - name + formatEN: Download url => [path]/[name] + formatZH: 下载 url => [path]/[name] + paramKeys: [] + /groups: + post: + consumes: + - application/json + description: 创建系统组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.GroupCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - System Group + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - type + formatEN: create group [name][type] + formatZH: 创建组 [name][type] + paramKeys: [] + /groups/del: + post: + consumes: + - application/json + description: 删除系统组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete group + tags: + - System Group + x-panel-log: + BeforeFunctions: + - db: groups + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + - db: groups + input_column: id + input_value: id + isList: false + output_column: type + output_value: type + bodyKeys: + - id + formatEN: delete group [type][name] + formatZH: 删除组 [type][name] + paramKeys: [] + /groups/search: + post: + consumes: + - application/json + description: 查询系统组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.GroupSearch' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.GroupInfo' + type: array + security: + - ApiKeyAuth: [] + summary: List groups + tags: + - System Group + /groups/update: + post: + consumes: + - application/json + description: 更新系统组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.GroupUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update group + tags: + - System Group + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - type + formatEN: update group [name][type] + formatZH: 更新组 [name][type] + paramKeys: [] + /host/conffile/update: + post: + consumes: + - application/json + description: 上传文件更新 SSH 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SSHConf' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update host SSH setting by file + tags: + - SSH + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: update SSH conf + formatZH: 修改 SSH 配置文件 + paramKeys: [] + /host/ssh/conf: + get: + description: 获取 SSH 配置文件 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load host SSH conf + tags: + - SSH + /host/ssh/generate: + post: + consumes: + - application/json + description: 生成 SSH 密钥 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.GenerateSSH' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Generate host SSH secret + tags: + - SSH + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: generate SSH secret + formatZH: '生成 SSH 密钥 ' + paramKeys: [] + /host/ssh/log: + post: + consumes: + - application/json + description: 获取 SSH 登录日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchSSHLog' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.SSHLog' + security: + - ApiKeyAuth: [] + summary: Load host SSH logs + tags: + - SSH + /host/ssh/operate: + post: + consumes: + - application/json + description: 修改 SSH 服务状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Operate' + responses: {} + security: + - ApiKeyAuth: [] + summary: Operate SSH + tags: + - SSH + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operation + formatEN: '[operation] SSH' + formatZH: '[operation] SSH ' + paramKeys: [] + /host/ssh/search: + post: + description: 加载 SSH 配置信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.SSHInfo' + security: + - ApiKeyAuth: [] + summary: Load host SSH setting info + tags: + - SSH + /host/ssh/secret: + post: + consumes: + - application/json + description: 获取 SSH 密钥 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.GenerateLoad' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load host SSH secret + tags: + - SSH + /host/ssh/update: + post: + consumes: + - application/json + description: 更新 SSH 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SSHUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update host SSH setting + tags: + - SSH + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - value + formatEN: update SSH setting [key] => [value] + formatZH: 修改 SSH 配置 [key] => [value] + paramKeys: [] + /host/tool: + post: + consumes: + - application/json + description: 获取主机工具状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.HostToolReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get tool + tags: + - Host tool + /host/tool/config: + post: + consumes: + - application/json + description: 操作主机工具配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.HostToolConfig' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get tool config + tags: + - Host tool + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operate + formatEN: '[operate] tool config' + formatZH: '[operate] 主机工具配置文件 ' + paramKeys: [] + /host/tool/create: + post: + consumes: + - application/json + description: 创建主机工具配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.HostToolCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create Host tool Config + tags: + - Host tool + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + formatEN: create [type] config + formatZH: 创建 [type] 配置 + paramKeys: [] + /host/tool/log: + post: + consumes: + - application/json + description: 获取主机工具日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.HostToolLogReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get tool + tags: + - Host tool + /host/tool/operate: + post: + consumes: + - application/json + description: 操作主机工具 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.HostToolReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate tool + tags: + - Host tool + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operate + - type + formatEN: '[operate] [type]' + formatZH: '[operate] [type] ' + paramKeys: [] + /host/tool/supervisor/process: + get: + consumes: + - application/json + description: 获取 Supervisor 进程配置 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get Supervisor process config + tags: + - Host tool + post: + consumes: + - application/json + description: 操作守护进程 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.SupervisorProcessConfig' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create Supervisor process + tags: + - Host tool + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operate + formatEN: '[operate] process' + formatZH: '[operate] 守护进程 ' + paramKeys: [] + /host/tool/supervisor/process/file: + post: + consumes: + - application/json + description: 操作 Supervisor 进程文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.SupervisorProcessFileReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get Supervisor process config + tags: + - Host tool + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operate + formatEN: '[operate] Supervisor Process Config file' + formatZH: '[operate] Supervisor 进程文件 ' + paramKeys: [] + /hosts: + post: + consumes: + - application/json + description: 创建主机 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.HostOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create host + tags: + - Host + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - addr + formatEN: create host [name][addr] + formatZH: 创建主机 [name][addr] + paramKeys: [] + /hosts/command: + get: + description: 获取快速命令列表 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.CommandInfo' + security: + - ApiKeyAuth: [] + summary: List commands + tags: + - Command + post: + consumes: + - application/json + description: 创建快速命令 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CommandOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create command + tags: + - Command + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - command + formatEN: create quick command [name][command] + formatZH: 创建快捷命令 [name][command] + paramKeys: [] + /hosts/command/del: + post: + consumes: + - application/json + description: 删除快速命令 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDeleteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete command + tags: + - Command + x-panel-log: + BeforeFunctions: + - db: commands + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete quick command [names] + formatZH: 删除快捷命令 [names] + paramKeys: [] + /hosts/command/redis: + get: + description: 获取 redis 快速命令列表 + responses: + "200": + description: OK + schema: + type: Array + security: + - ApiKeyAuth: [] + summary: List redis commands + tags: + - Redis Command + post: + consumes: + - application/json + description: 保存 Redis 快速命令 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.RedisCommand' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Save redis command + tags: + - Redis Command + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - command + formatEN: save quick command for redis [name][command] + formatZH: 保存 redis 快捷命令 [name][command] + paramKeys: [] + /hosts/command/redis/del: + post: + consumes: + - application/json + description: 删除 redis 快速命令 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDeleteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete redis command + tags: + - Redis Command + x-panel-log: + BeforeFunctions: + - db: redis_commands + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete quick command of redis [names] + formatZH: 删除 redis 快捷命令 [names] + paramKeys: [] + /hosts/command/redis/search: + post: + consumes: + - application/json + description: 获取 redis 快速命令列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page redis commands + tags: + - Redis Command + /hosts/command/search: + post: + consumes: + - application/json + description: 获取快速命令列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page commands + tags: + - Command + /hosts/command/tree: + get: + consumes: + - application/json + description: 获取快速命令树 + responses: + "200": + description: OK + schema: + type: Array + security: + - ApiKeyAuth: [] + summary: Tree commands + tags: + - Command + /hosts/command/update: + post: + consumes: + - application/json + description: 更新快速命令 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CommandOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update command + tags: + - Command + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: update quick command [name] + formatZH: 更新快捷命令 [name] + paramKeys: [] + /hosts/del: + post: + consumes: + - application/json + description: 删除主机 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDeleteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete host + tags: + - Host + x-panel-log: + BeforeFunctions: + - db: hosts + input_column: id + input_value: ids + isList: true + output_column: addr + output_value: addrs + bodyKeys: + - ids + formatEN: delete host [addrs] + formatZH: 删除主机 [addrs] + paramKeys: [] + /hosts/firewall/base: + get: + description: 获取防火墙基础信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.FirewallBaseInfo' + security: + - ApiKeyAuth: [] + summary: Load firewall base info + tags: + - Firewall + /hosts/firewall/batch: + post: + consumes: + - application/json + description: 批量删除防火墙规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchRuleOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - Firewall + /hosts/firewall/forward: + post: + consumes: + - application/json + description: 更新防火墙端口转发规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ForwardRuleOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - Firewall + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - source_port + formatEN: update port forward rules [source_port] + formatZH: 更新端口转发规则 [source_port] + paramKeys: [] + /hosts/firewall/ip: + post: + consumes: + - application/json + description: 创建防火墙 IP 规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.AddrRuleOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - Firewall + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - strategy + - address + formatEN: create address rules [strategy][address] + formatZH: 添加 ip 规则 [strategy] [address] + paramKeys: [] + /hosts/firewall/operate: + post: + consumes: + - application/json + description: 修改防火墙状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.FirewallOperation' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page firewall status + tags: + - Firewall + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operation + formatEN: '[operation] firewall' + formatZH: '[operation] 防火墙' + paramKeys: [] + /hosts/firewall/port: + post: + consumes: + - application/json + description: 创建防火墙端口规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PortRuleOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - Firewall + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - port + - strategy + formatEN: create port rules [strategy][port] + formatZH: 添加端口规则 [strategy] [port] + paramKeys: [] + /hosts/firewall/search: + post: + consumes: + - application/json + description: 获取防火墙规则列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.RuleSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page firewall rules + tags: + - Firewall + /hosts/firewall/update/addr: + post: + consumes: + - application/json + description: 更新 ip 防火墙规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.AddrRuleUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - Firewall + /hosts/firewall/update/description: + post: + consumes: + - application/json + description: 更新防火墙描述 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateFirewallDescription' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update rule description + tags: + - Firewall + /hosts/firewall/update/port: + post: + consumes: + - application/json + description: 更新端口防火墙规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PortRuleUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create group + tags: + - Firewall + /hosts/monitor/clean: + post: + description: 清空监控数据 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Clean monitor datas + tags: + - Monitor + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: clean monitor datas + formatZH: 清空监控数据 + paramKeys: [] + /hosts/monitor/search: + post: + description: 获取监控数据 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MonitorSearch' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load monitor datas + tags: + - Monitor + /hosts/search: + post: + consumes: + - application/json + description: 获取主机列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchHostWithPage' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.HostTree' + type: array + security: + - ApiKeyAuth: [] + summary: Page host + tags: + - Host + /hosts/test/byid/:id: + post: + consumes: + - application/json + description: 测试主机连接 + parameters: + - description: request + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + type: boolean + security: + - ApiKeyAuth: [] + summary: Test host conn by host id + tags: + - Host + /hosts/test/byinfo: + post: + consumes: + - application/json + description: 测试主机连接 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.HostConnTest' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Test host conn by info + tags: + - Host + /hosts/tree: + post: + consumes: + - application/json + description: 加载主机树 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchForTree' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.HostTree' + type: array + security: + - ApiKeyAuth: [] + summary: Load host tree + tags: + - Host + /hosts/update: + post: + consumes: + - application/json + description: 更新主机 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.HostOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update host + tags: + - Host + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - addr + formatEN: update host [name][addr] + formatZH: 更新主机信息 [name][addr] + paramKeys: [] + /hosts/update/group: + post: + consumes: + - application/json + description: 切换分组 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangeHostGroup' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update host group + tags: + - Host + x-panel-log: + BeforeFunctions: + - db: hosts + input_column: id + input_value: id + isList: false + output_column: addr + output_value: addr + bodyKeys: + - id + - group + formatEN: change host [addr] group => [group] + formatZH: 切换主机[addr]分组 => [group] + paramKeys: [] + /logs/clean: + post: + consumes: + - application/json + description: 清空操作日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CleanLog' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Clean operation logs + tags: + - Logs + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - logType + formatEN: Clean the [logType] log information + formatZH: 清空 [logType] 日志信息 + paramKeys: [] + /logs/login: + post: + consumes: + - application/json + description: 获取系统登录日志列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchLgLogWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page login logs + tags: + - Logs + /logs/operation: + post: + consumes: + - application/json + description: 获取系统操作日志列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchOpLogWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page operation logs + tags: + - Logs + /logs/system: + post: + description: 获取系统日志 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load system logs + tags: + - Logs + /logs/system/files: + get: + description: 获取系统日志文件列表 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load system log files + tags: + - Logs + /openresty: + get: + description: 获取 OpenResty 配置信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.FileInfo' + security: + - ApiKeyAuth: [] + summary: Load OpenResty conf + tags: + - OpenResty + /openresty/clear: + post: + description: 清理 OpenResty 代理缓存 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Clear OpenResty proxy cache + tags: + - OpenResty + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Clear nginx proxy cache + formatZH: 清理 Openresty 代理缓存 + paramKeys: [] + /openresty/file: + post: + consumes: + - application/json + description: 上传更新 OpenResty 配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxConfigFileUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update OpenResty conf by upload file + tags: + - OpenResty + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Update nginx conf + formatZH: 更新 nginx 配置 + paramKeys: [] + /openresty/scope: + post: + consumes: + - application/json + description: 获取部分 OpenResty 配置信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxScopeReq' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.NginxParam' + type: array + security: + - ApiKeyAuth: [] + summary: Load partial OpenResty conf + tags: + - OpenResty + /openresty/status: + get: + description: 获取 OpenResty 状态信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.NginxStatus' + security: + - ApiKeyAuth: [] + summary: Load OpenResty status info + tags: + - OpenResty + /openresty/update: + post: + consumes: + - application/json + description: 更新 OpenResty 配置信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxConfigUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update OpenResty conf + tags: + - OpenResty + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteId + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteId + formatEN: Update nginx conf [domain] + formatZH: 更新 nginx 配置 [domain] + paramKeys: [] + /process/stop: + post: + description: 停止进程 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.ProcessReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Stop Process + tags: + - Process + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - PID + formatEN: 结束进程 [PID] + formatZH: 结束进程 [PID] + paramKeys: [] + /runtimes: + post: + consumes: + - application/json + description: 创建运行环境 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.RuntimeCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create runtime + tags: + - Runtime + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Create runtime [name] + formatZH: 创建运行环境 [name] + paramKeys: [] + /runtimes/:id: + get: + consumes: + - application/json + description: 获取运行环境 + parameters: + - description: request + in: path + name: id + required: true + type: string + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get runtime + tags: + - Runtime + /runtimes/del: + post: + consumes: + - application/json + description: 删除运行环境 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.RuntimeDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete runtime + tags: + - Website + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - id + formatEN: Delete website [name] + formatZH: 删除网站 [name] + paramKeys: [] + /runtimes/node/modules: + post: + consumes: + - application/json + description: 获取 Node 项目的 modules + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NodeModuleReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get Node modules + tags: + - Runtime + /runtimes/node/modules/operate: + post: + consumes: + - application/json + description: 操作 Node 项目 modules + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NodeModuleReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate Node modules + tags: + - Runtime + /runtimes/node/package: + post: + consumes: + - application/json + description: 获取 Node 项目的 scripts + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NodePackageReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get Node package scripts + tags: + - Runtime + /runtimes/operate: + post: + consumes: + - application/json + description: 操作运行环境 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.RuntimeOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate runtime + tags: + - Runtime + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - id + formatEN: Operate runtime [name] + formatZH: 操作运行环境 [name] + paramKeys: [] + /runtimes/php/extensions: + post: + consumes: + - application/json + description: Create Extensions + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.PHPExtensionsCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create Extensions + tags: + - PHP Extensions + /runtimes/php/extensions/del: + post: + consumes: + - application/json + description: Delete Extensions + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.PHPExtensionsDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete Extensions + tags: + - PHP Extensions + /runtimes/php/extensions/search: + post: + consumes: + - application/json + description: Page Extensions + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.PHPExtensionsSearch' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.PHPExtensionsDTO' + type: array + security: + - ApiKeyAuth: [] + summary: Page Extensions + tags: + - PHP Extensions + /runtimes/php/extensions/update: + post: + consumes: + - application/json + description: Update Extensions + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.PHPExtensionsUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update Extensions + tags: + - PHP Extensions + /runtimes/search: + post: + consumes: + - application/json + description: 获取运行环境列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.RuntimeSearch' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: List runtimes + tags: + - Runtime + /runtimes/sync: + post: + consumes: + - application/json + description: 同步运行环境状态 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Sync runtime status + tags: + - Runtime + /runtimes/update: + post: + consumes: + - application/json + description: 更新运行环境 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.RuntimeUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update runtime + tags: + - Runtime + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Update runtime [name] + formatZH: 更新运行环境 [name] + paramKeys: [] + /settings/backup: + post: + consumes: + - application/json + description: 创建备份账号 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BackupOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create backup account + tags: + - Backup Account + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + formatEN: create backup account [type] + formatZH: 创建备份账号 [type] + paramKeys: [] + /settings/backup/backup: + post: + consumes: + - application/json + description: 备份系统数据 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CommonBackup' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Backup system data + tags: + - Backup Account + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + - name + - detailName + formatEN: backup [type] data [name][detailName] + formatZH: 备份 [type] 数据 [name][detailName] + paramKeys: [] + /settings/backup/del: + post: + consumes: + - application/json + description: 删除备份账号 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete backup account + tags: + - Backup Account + x-panel-log: + BeforeFunctions: + - db: backup_accounts + input_column: id + input_value: id + isList: false + output_column: type + output_value: types + bodyKeys: + - id + formatEN: delete backup account [types] + formatZH: 删除备份账号 [types] + paramKeys: [] + /settings/backup/onedrive: + get: + consumes: + - application/json + description: 获取 OneDrive 信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.OneDriveInfo' + security: + - ApiKeyAuth: [] + summary: Load OneDrive info + tags: + - Backup Account + /settings/backup/record/del: + post: + consumes: + - application/json + description: 删除备份记录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDeleteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete backup record + tags: + - Backup Account + x-panel-log: + BeforeFunctions: + - db: backup_records + input_column: id + input_value: ids + isList: true + output_column: file_name + output_value: files + bodyKeys: + - ids + formatEN: delete backup records [files] + formatZH: 删除备份记录 [files] + paramKeys: [] + /settings/backup/record/download: + post: + consumes: + - application/json + description: 下载备份记录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.DownloadRecord' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Download backup record + tags: + - Backup Account + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - source + - fileName + formatEN: download backup records [source][fileName] + formatZH: 下载备份记录 [source][fileName] + paramKeys: [] + /settings/backup/record/search: + post: + consumes: + - application/json + description: 获取备份记录列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.RecordSearch' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Page backup records + tags: + - Backup Account + /settings/backup/record/search/bycronjob: + post: + consumes: + - application/json + description: 通过计划任务获取备份记录列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.RecordSearchByCronjob' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Page backup records by cronjob + tags: + - Backup Account + /settings/backup/recover: + post: + consumes: + - application/json + description: 恢复系统数据 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CommonRecover' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Recover system data + tags: + - Backup Account + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + - name + - detailName + - file + formatEN: recover [type] data [name][detailName] from [file] + formatZH: 从 [file] 恢复 [type] 数据 [name][detailName] + paramKeys: [] + /settings/backup/recover/byupload: + post: + consumes: + - application/json + description: 从上传恢复系统数据 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.CommonRecover' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Recover system data by upload + tags: + - Backup Account + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + - name + - detailName + - file + formatEN: recover [type] data [name][detailName] from [file] + formatZH: 从 [file] 恢复 [type] 数据 [name][detailName] + paramKeys: [] + /settings/backup/refresh/onedrive: + post: + description: 刷新 OneDrive token + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Refresh OneDrive token + tags: + - Backup Account + /settings/backup/search: + get: + description: 获取备份账号列表 + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.BackupInfo' + type: array + security: + - ApiKeyAuth: [] + summary: List backup accounts + tags: + - Backup Account + post: + consumes: + - application/json + description: 获取 bucket 列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ForBuckets' + responses: + "200": + description: OK + schema: + items: + type: string + type: array + security: + - ApiKeyAuth: [] + summary: List buckets + tags: + - Backup Account + /settings/backup/search/files: + post: + consumes: + - application/json + description: 获取备份账号内文件列表 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BackupSearchFile' + responses: + "200": + description: OK + schema: + items: + type: string + type: array + security: + - ApiKeyAuth: [] + summary: List files from backup accounts + tags: + - Backup Account + /settings/backup/update: + post: + consumes: + - application/json + description: 更新备份账号信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BackupOperate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update backup account + tags: + - Backup Account + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + formatEN: update backup account [types] + formatZH: 更新备份账号 [types] + paramKeys: [] + /settings/basedir: + get: + description: 获取安装根目录 + responses: + "200": + description: OK + schema: + type: string + security: + - ApiKeyAuth: [] + summary: Load local backup dir + tags: + - System Setting + /settings/bind/update: + post: + consumes: + - application/json + description: 更新系统监听信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BindInfo' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update system bind info + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - ipv6 + - bindAddress + formatEN: 'update system bind info => ipv6: [ipv6], 监听 IP: [bindAddress]' + formatZH: '修改系统监听信息 => ipv6: [ipv6], 监听 IP: [bindAddress]' + paramKeys: [] + /settings/expired/handle: + post: + consumes: + - application/json + description: 重置过期系统登录密码 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PasswordUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Reset system password expired + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: reset an expired Password + formatZH: 重置过期密码 + paramKeys: [] + /settings/interface: + get: + consumes: + - application/json + description: 获取系统地址信息 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load system address + tags: + - System Setting + /settings/menu/update: + post: + consumes: + - application/json + description: 隐藏高级功能菜单 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SettingUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update system setting + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Hide advanced feature menu. + formatZH: 隐藏高级功能菜单 + paramKeys: [] + /settings/mfa: + post: + consumes: + - application/json + description: 获取 mfa 信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MfaCredential' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/mfa.Otp' + security: + - ApiKeyAuth: [] + summary: Load mfa info + tags: + - System Setting + /settings/mfa/bind: + post: + consumes: + - application/json + description: Mfa 绑定 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.MfaCredential' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Bind mfa + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: bind mfa + formatZH: mfa 绑定 + paramKeys: [] + /settings/password/update: + post: + consumes: + - application/json + description: 更新系统登录密码 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PasswordUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update system password + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: update system password + formatZH: 修改系统密码 + paramKeys: [] + /settings/port/update: + post: + consumes: + - application/json + description: 更新系统端口 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PortUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update system port + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - serverPort + formatEN: update system port => [serverPort] + formatZH: 修改系统端口 => [serverPort] + paramKeys: [] + /settings/proxy/update: + post: + consumes: + - application/json + description: 服务器代理配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ProxyUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update proxy setting + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - proxyUrl + - proxyPort + formatEN: set proxy [proxyPort]:[proxyPort]. + formatZH: 服务器代理配置 [proxyPort]:[proxyPort] + paramKeys: [] + /settings/search: + post: + description: 加载系统配置信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.SettingInfo' + security: + - ApiKeyAuth: [] + summary: Load system setting info + tags: + - System Setting + /settings/search/available: + get: + description: 获取系统可用状态 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load system available status + tags: + - System Setting + /settings/snapshot: + post: + consumes: + - application/json + description: 创建系统快照 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SnapshotCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create system snapshot + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - from + - description + formatEN: Create system backup [description] to [from] + formatZH: 创建系统快照 [description] 到 [from] + paramKeys: [] + /settings/snapshot/del: + post: + consumes: + - application/json + description: 删除系统快照 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SnapshotBatchDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete system backup + tags: + - System Setting + x-panel-log: + BeforeFunctions: + - db: snapshots + input_column: id + input_value: ids + isList: true + output_column: name + output_value: name + bodyKeys: + - ids + formatEN: Delete system backup [name] + formatZH: 删除系统快照 [name] + paramKeys: [] + /settings/snapshot/description/update: + post: + consumes: + - application/json + description: 更新快照描述信息 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateDescription' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update snapshot description + tags: + - System Setting + x-panel-log: + BeforeFunctions: + - db: snapshots + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + - description + formatEN: The description of the snapshot [name] is modified => [description] + formatZH: 快照 [name] 描述信息修改 [description] + paramKeys: [] + /settings/snapshot/import: + post: + consumes: + - application/json + description: 导入已有快照 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SnapshotImport' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Import system snapshot + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - from + - names + formatEN: Sync system snapshots [names] from [from] + formatZH: 从 [from] 同步系统快照 [names] + paramKeys: [] + /settings/snapshot/recover: + post: + consumes: + - application/json + description: 从系统快照恢复 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SnapshotRecover' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Recover system backup + tags: + - System Setting + x-panel-log: + BeforeFunctions: + - db: snapshots + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Recover from system backup [name] + formatZH: 从系统快照 [name] 恢复 + paramKeys: [] + /settings/snapshot/rollback: + post: + consumes: + - application/json + description: 从系统快照回滚 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SnapshotRecover' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Rollback system backup + tags: + - System Setting + x-panel-log: + BeforeFunctions: + - db: snapshots + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Rollback from system backup [name] + formatZH: 从系统快照 [name] 回滚 + paramKeys: [] + /settings/snapshot/search: + post: + consumes: + - application/json + description: 获取系统快照列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page system snapshot + tags: + - System Setting + /settings/snapshot/status: + post: + consumes: + - application/json + description: 获取快照状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load Snapshot status + tags: + - System Setting + /settings/ssl/download: + post: + description: 下载证书 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Download system cert + tags: + - System Setting + /settings/ssl/info: + get: + description: 获取证书信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.SettingInfo' + security: + - ApiKeyAuth: [] + summary: Load system cert info + tags: + - System Setting + /settings/ssl/update: + post: + consumes: + - application/json + description: 修改系统 ssl 登录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SSLUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update system ssl + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - ssl + formatEN: update system ssl => [ssl] + formatZH: 修改系统 ssl => [ssl] + paramKeys: [] + /settings/update: + post: + consumes: + - application/json + description: 更新系统配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SettingUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update system setting + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - value + formatEN: update system setting [key] => [value] + formatZH: 修改系统配置 [key] => [value] + paramKeys: [] + /settings/upgrade: + get: + consumes: + - application/json + description: 获取版本 release notes + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Upgrade' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load release notes by version + tags: + - System Setting + post: + consumes: + - application/json + description: 系统更新 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Upgrade' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Upgrade + tags: + - System Setting + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - version + formatEN: upgrade system => [version] + formatZH: 更新系统 => [version] + paramKeys: [] + /toolbox/clam: + post: + consumes: + - application/json + description: 创建扫描规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create clam + tags: + - Clam + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - path + formatEN: create clam [name][path] + formatZH: 创建扫描规则 [name][path] + paramKeys: [] + /toolbox/clam/base: + get: + consumes: + - application/json + description: 获取 Clam 基础信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ClamBaseInfo' + security: + - ApiKeyAuth: [] + summary: Load clam base info + tags: + - Clam + /toolbox/clam/del: + post: + consumes: + - application/json + description: 删除扫描规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete clam + tags: + - Clam + x-panel-log: + BeforeFunctions: + - db: clams + input_column: id + input_value: ids + isList: true + output_column: name + output_value: names + bodyKeys: + - ids + formatEN: delete clam [names] + formatZH: 删除扫描规则 [names] + paramKeys: [] + /toolbox/clam/file/search: + post: + consumes: + - application/json + description: 获取扫描文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamFileReq' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Load clam file + tags: + - Clam + /toolbox/clam/file/update: + post: + consumes: + - application/json + description: 更新病毒扫描配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateByNameAndFile' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update clam file + tags: + - Clam + /toolbox/clam/handle: + post: + consumes: + - application/json + description: 执行病毒扫描 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Handle clam scan + tags: + - Clam + x-panel-log: + BeforeFunctions: + - db: clams + input_column: id + input_value: id + isList: true + output_column: name + output_value: name + bodyKeys: + - id + formatEN: handle clam scan [name] + formatZH: 执行病毒扫描 [name] + paramKeys: [] + /toolbox/clam/operate: + post: + consumes: + - application/json + description: 修改 Clam 状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Operate' + responses: {} + security: + - ApiKeyAuth: [] + summary: Operate Clam + tags: + - Clam + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operation + formatEN: '[operation] FTP' + formatZH: '[operation] Clam' + paramKeys: [] + /toolbox/clam/record/clean: + post: + consumes: + - application/json + description: 清空扫描报告 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperateByID' + responses: {} + security: + - ApiKeyAuth: [] + summary: Clean clam record + tags: + - Clam + x-panel-log: + BeforeFunctions: + - db: clams + input_column: id + input_value: id + isList: true + output_column: name + output_value: name + bodyKeys: + - id + formatEN: clean clam record [name] + formatZH: 清空扫描报告 [name] + paramKeys: [] + /toolbox/clam/record/log: + post: + consumes: + - application/json + description: 获取扫描结果详情 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamLogReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load clam record detail + tags: + - Clam + /toolbox/clam/record/search: + post: + consumes: + - application/json + description: 获取扫描结果列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamLogSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page clam record + tags: + - Clam + /toolbox/clam/search: + post: + consumes: + - application/json + description: 获取扫描规则列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page clam + tags: + - Clam + /toolbox/clam/status/update: + post: + consumes: + - application/json + description: 修改扫描规则状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamUpdateStatus' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update clam status + tags: + - Clam + x-panel-log: + BeforeFunctions: + - db: clams + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + - status + formatEN: change the status of clam [name] to [status]. + formatZH: 修改扫描规则 [name] 状态为 [status] + paramKeys: [] + /toolbox/clam/update: + post: + consumes: + - application/json + description: 修改扫描规则 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ClamUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update clam + tags: + - Clam + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + - path + formatEN: update clam [name][path] + formatZH: 修改扫描规则 [name][path] + paramKeys: [] + /toolbox/clean: + post: + consumes: + - application/json + description: 清理系统垃圾文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + items: + $ref: '#/definitions/dto.Clean' + type: array + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Clean system + tags: + - Device + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: Clean system junk files + formatZH: 清理系统垃圾文件 + paramKeys: [] + /toolbox/device/base: + post: + description: 获取设备基础信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.DeviceBaseInfo' + security: + - ApiKeyAuth: [] + summary: Load device base info + tags: + - Device + /toolbox/device/check/dns: + post: + consumes: + - application/json + description: 检查系统 DNS 配置可用性 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SettingUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Check device DNS conf + tags: + - Device + /toolbox/device/conf: + post: + consumes: + - application/json + description: 获取系统配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.OperationWithName' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: load conf + tags: + - Device + /toolbox/device/update/byconf: + post: + consumes: + - application/json + description: 通过文件修改配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateByNameAndFile' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update device conf by file + tags: + - Device + /toolbox/device/update/conf: + post: + consumes: + - application/json + description: 修改系统参数 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SettingUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update device + tags: + - Device + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - value + formatEN: update device conf [key] => [value] + formatZH: 修改主机参数 [key] => [value] + paramKeys: [] + /toolbox/device/update/host: + post: + description: 修改系统 hosts + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update device hosts + tags: + - Device + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - value + formatEN: update device host [key] => [value] + formatZH: 修改主机 Host [key] => [value] + paramKeys: [] + /toolbox/device/update/passwd: + post: + consumes: + - application/json + description: 修改系统密码 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.ChangePasswd' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update device passwd + tags: + - Device + /toolbox/device/update/swap: + post: + consumes: + - application/json + description: 修改系统 Swap + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SwapHelper' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update device swap + tags: + - Device + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operate + - path + formatEN: '[operate] device swap [path]' + formatZH: '[operate] 主机 swap [path]' + paramKeys: [] + /toolbox/device/zone/options: + get: + consumes: + - application/json + description: 获取系统可用时区选项 + responses: + "200": + description: OK + schema: + type: Array + security: + - ApiKeyAuth: [] + summary: list time zone options + tags: + - Device + /toolbox/fail2ban/base: + get: + description: 获取 Fail2ban 基础信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.Fail2BanBaseInfo' + security: + - ApiKeyAuth: [] + summary: Load fail2ban base info + tags: + - Fail2ban + /toolbox/fail2ban/load/conf: + get: + consumes: + - application/json + description: 获取 fail2ban 配置文件 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Load fail2ban conf + tags: + - Fail2ban + /toolbox/fail2ban/operate: + post: + consumes: + - application/json + description: 修改 Fail2ban 状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Operate' + responses: {} + security: + - ApiKeyAuth: [] + summary: Operate fail2ban + tags: + - Fail2ban + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operation + formatEN: '[operation] Fail2ban' + formatZH: '[operation] Fail2ban' + paramKeys: [] + /toolbox/fail2ban/operate/sshd: + post: + consumes: + - application/json + description: 配置 sshd + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Operate' + responses: {} + security: + - ApiKeyAuth: [] + summary: Operate sshd of fail2ban + tags: + - Fail2ban + /toolbox/fail2ban/search: + post: + consumes: + - application/json + description: 获取 Fail2ban ip + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Fail2BanSearch' + responses: + "200": + description: OK + schema: + type: Array + security: + - ApiKeyAuth: [] + summary: Page fail2ban ip list + tags: + - Fail2ban + /toolbox/fail2ban/update: + post: + consumes: + - application/json + description: 修改 Fail2ban 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Fail2BanUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update fail2ban conf + tags: + - Fail2ban + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - key + - value + formatEN: update fail2ban conf [key] => [value] + formatZH: 修改 Fail2ban 配置 [key] => [value] + paramKeys: [] + /toolbox/fail2ban/update/byconf: + post: + consumes: + - application/json + description: 通过文件修改 fail2ban 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.UpdateByFile' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update fail2ban conf by file + tags: + - Fail2ban + /toolbox/ftp: + post: + consumes: + - application/json + description: 创建 FTP 账户 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.FtpCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create FTP user + tags: + - FTP + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - user + - path + formatEN: create FTP [user][path] + formatZH: 创建 FTP 账户 [user][path] + paramKeys: [] + /toolbox/ftp/base: + get: + description: 获取 FTP 基础信息 + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.FtpBaseInfo' + security: + - ApiKeyAuth: [] + summary: Load FTP base info + tags: + - FTP + /toolbox/ftp/del: + post: + consumes: + - application/json + description: 删除 FTP 账户 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDeleteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete FTP user + tags: + - FTP + x-panel-log: + BeforeFunctions: + - db: ftps + input_column: id + input_value: ids + isList: true + output_column: user + output_value: users + bodyKeys: + - ids + formatEN: delete FTP users [users] + formatZH: 删除 FTP 账户 [users] + paramKeys: [] + /toolbox/ftp/log/search: + post: + consumes: + - application/json + description: 获取 FTP 操作日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.FtpLogSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Load FTP operation log + tags: + - FTP + /toolbox/ftp/operate: + post: + consumes: + - application/json + description: 修改 FTP 状态 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.Operate' + responses: {} + security: + - ApiKeyAuth: [] + summary: Operate FTP + tags: + - FTP + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - operation + formatEN: '[operation] FTP' + formatZH: '[operation] FTP' + paramKeys: [] + /toolbox/ftp/search: + post: + consumes: + - application/json + description: 获取 FTP 账户列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.SearchWithPage' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page FTP user + tags: + - FTP + /toolbox/ftp/sync: + post: + consumes: + - application/json + description: 同步 FTP 账户 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.BatchDeleteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Sync FTP user + tags: + - FTP + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: sync FTP users + formatZH: 同步 FTP 账户 + paramKeys: [] + /toolbox/ftp/update: + post: + consumes: + - application/json + description: 修改 FTP 账户 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.FtpUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update FTP user + tags: + - FTP + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - user + - path + formatEN: update FTP [user][path] + formatZH: 修改 FTP 账户 [user][path] + paramKeys: [] + /toolbox/scan: + post: + description: 扫描系统垃圾文件 + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Scan system + tags: + - Device + x-panel-log: + BeforeFunctions: [] + bodyKeys: [] + formatEN: scan System Junk Files + formatZH: 扫描系统垃圾文件 + paramKeys: [] + /websites: + post: + consumes: + - application/json + description: 创建网站 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create website + tags: + - Website + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - primaryDomain + formatEN: Create website [primaryDomain] + formatZH: 创建网站 [primaryDomain] + paramKeys: [] + /websites/:id: + get: + consumes: + - application/json + description: 通过 id 查询网站 + parameters: + - description: request + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteDTO' + security: + - ApiKeyAuth: [] + summary: Search website by id + tags: + - Website + /websites/:id/config/:type: + get: + consumes: + - application/json + description: 通过 id 查询网站 nginx + parameters: + - description: request + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.FileInfo' + security: + - ApiKeyAuth: [] + summary: Search website nginx by id + tags: + - Website Nginx + /websites/:id/https: + get: + consumes: + - application/json + description: 获取 https 配置 + parameters: + - description: request + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteHTTPS' + security: + - ApiKeyAuth: [] + summary: Load https conf + tags: + - Website HTTPS + post: + consumes: + - application/json + description: 更新 https 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteHTTPSOp' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteHTTPS' + security: + - ApiKeyAuth: [] + summary: Update https conf + tags: + - Website HTTPS + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteId + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteId + formatEN: Update website https [domain] conf + formatZH: 更新网站 [domain] https 配置 + paramKeys: [] + /websites/acme: + post: + consumes: + - application/json + description: 创建网站 acme + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteAcmeAccountCreate' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteAcmeAccountDTO' + security: + - ApiKeyAuth: [] + summary: Create website acme account + tags: + - Website Acme + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - email + formatEN: Create website acme [email] + formatZH: 创建网站 acme [email] + paramKeys: [] + /websites/acme/del: + post: + consumes: + - application/json + description: 删除网站 acme + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteResourceReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete website acme account + tags: + - Website Acme + x-panel-log: + BeforeFunctions: + - db: website_acme_accounts + input_column: id + input_value: id + isList: false + output_column: email + output_value: email + bodyKeys: + - id + formatEN: Delete website acme [email] + formatZH: 删除网站 acme [email] + paramKeys: [] + /websites/acme/search: + post: + consumes: + - application/json + description: 获取网站 acme 列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageInfo' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page website acme accounts + tags: + - Website Acme + /websites/auths: + post: + consumes: + - application/json + description: 获取密码访问配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxAuthReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get AuthBasic conf + tags: + - Website + /websites/auths/update: + post: + consumes: + - application/json + description: 更新密码访问配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxAuthUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get AuthBasic conf + tags: + - Website + /websites/ca: + post: + consumes: + - application/json + description: 创建网站 ca + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCACreate' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/request.WebsiteCACreate' + security: + - ApiKeyAuth: [] + summary: Create website ca + tags: + - Website CA + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Create website ca [name] + formatZH: 创建网站 ca [name] + paramKeys: [] + /websites/ca/{id}: + get: + consumes: + - application/json + description: 获取网站 ca + parameters: + - description: id + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteCADTO' + security: + - ApiKeyAuth: [] + summary: Get website ca + tags: + - Website CA + /websites/ca/del: + post: + consumes: + - application/json + description: 删除网站 ca + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCommonReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete website ca + tags: + - Website CA + x-panel-log: + BeforeFunctions: + - db: website_cas + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Delete website ca [name] + formatZH: 删除网站 ca [name] + paramKeys: [] + /websites/ca/download: + post: + consumes: + - application/json + description: 下载 CA 证书文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteResourceReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Download CA file + tags: + - Website CA + x-panel-log: + BeforeFunctions: + - db: website_cas + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: download ca file [name] + formatZH: 下载 CA 证书文件 [name] + paramKeys: [] + /websites/ca/obtain: + post: + consumes: + - application/json + description: 自签 SSL 证书 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCAObtain' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Obtain SSL + tags: + - Website CA + x-panel-log: + BeforeFunctions: + - db: website_cas + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Obtain SSL [name] + formatZH: 自签 SSL 证书 [name] + paramKeys: [] + /websites/ca/renew: + post: + consumes: + - application/json + description: 续签 SSL 证书 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCAObtain' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Obtain SSL + tags: + - Website CA + x-panel-log: + BeforeFunctions: + - db: website_cas + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Obtain SSL [name] + formatZH: 自签 SSL 证书 [name] + paramKeys: [] + /websites/ca/search: + post: + consumes: + - application/json + description: 获取网站 ca 列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCASearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page website ca + tags: + - Website CA + /websites/check: + post: + consumes: + - application/json + description: 网站创建前检查 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteInstallCheckReq' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.WebsitePreInstallCheck' + type: array + security: + - ApiKeyAuth: [] + summary: Check before create website + tags: + - Website + /websites/config: + post: + consumes: + - application/json + description: 获取 nginx 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxScopeReq' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteNginxConfig' + security: + - ApiKeyAuth: [] + summary: Load nginx conf + tags: + - Website Nginx + /websites/config/update: + post: + consumes: + - application/json + description: 更新 nginx 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxConfigUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update nginx conf + tags: + - Website Nginx + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteId + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteId + formatEN: Nginx conf update [domain] + formatZH: nginx 配置修改 [domain] + paramKeys: [] + /websites/default/html/:type: + get: + consumes: + - application/json + description: 获取默认 html + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.FileInfo' + security: + - ApiKeyAuth: [] + summary: Get default html + tags: + - Website + /websites/default/html/update: + post: + consumes: + - application/json + description: 更新默认 html + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteHtmlUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update default html + tags: + - Website + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + formatEN: Update default html + formatZH: 更新默认 html + paramKeys: [] + /websites/default/server: + post: + consumes: + - application/json + description: 操作网站日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDefaultUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Change default server + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + - operate + formatEN: Change default server => [domain] + formatZH: 修改默认 server => [domain] + paramKeys: [] + /websites/del: + post: + consumes: + - application/json + description: 删除网站 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete website + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: Delete website [domain] + formatZH: 删除网站 [domain] + paramKeys: [] + /websites/dir: + post: + consumes: + - application/json + description: 获取网站目录配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteCommonReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get website dir + tags: + - Website + /websites/dir/permission: + post: + consumes: + - application/json + description: 更新网站目录权限 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteUpdateDirPermission' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update Site Dir permission + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: Update domain [domain] dir permission + formatZH: 更新网站 [domain] 目录权限 + paramKeys: [] + /websites/dir/update: + post: + consumes: + - application/json + description: 更新网站目录 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteUpdateDir' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update Site Dir + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: Update domain [domain] dir + formatZH: 更新网站 [domain] 目录 + paramKeys: [] + /websites/dns: + post: + consumes: + - application/json + description: 创建网站 dns + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDnsAccountCreate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Create website dns account + tags: + - Website DNS + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Create website dns [name] + formatZH: 创建网站 dns [name] + paramKeys: [] + /websites/dns/del: + post: + consumes: + - application/json + description: 删除网站 dns + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteResourceReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete website dns account + tags: + - Website DNS + x-panel-log: + BeforeFunctions: + - db: website_dns_accounts + input_column: id + input_value: id + isList: false + output_column: name + output_value: name + bodyKeys: + - id + formatEN: Delete website dns [name] + formatZH: 删除网站 dns [name] + paramKeys: [] + /websites/dns/search: + post: + consumes: + - application/json + description: 获取网站 dns 列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/dto.PageInfo' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page website dns accounts + tags: + - Website DNS + /websites/dns/update: + post: + consumes: + - application/json + description: 更新网站 dns + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDnsAccountUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update website dns account + tags: + - Website DNS + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - name + formatEN: Update website dns [name] + formatZH: 更新网站 dns [name] + paramKeys: [] + /websites/domains: + post: + consumes: + - application/json + description: 创建网站域名 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDomainCreate' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/model.WebsiteDomain' + security: + - ApiKeyAuth: [] + summary: Create website domain + tags: + - Website Domain + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - domain + formatEN: Create domain [domain] + formatZH: 创建域名 [domain] + paramKeys: [] + /websites/domains/:websiteId: + get: + consumes: + - application/json + description: 通过网站 id 查询域名 + parameters: + - description: request + in: path + name: websiteId + required: true + type: integer + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/model.WebsiteDomain' + type: array + security: + - ApiKeyAuth: [] + summary: Search website domains by websiteId + tags: + - Website Domain + /websites/domains/del: + post: + consumes: + - application/json + description: 删除网站域名 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDomainDelete' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete website domain + tags: + - Website Domain + x-panel-log: + BeforeFunctions: + - db: website_domains + input_column: id + input_value: id + isList: false + output_column: domain + output_value: domain + bodyKeys: + - id + formatEN: Delete domain [domain] + formatZH: 删除域名 [domain] + paramKeys: [] + /websites/leech: + post: + consumes: + - application/json + description: 获取防盗链配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxCommonReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get AntiLeech conf + tags: + - Website + /websites/leech/update: + post: + consumes: + - application/json + description: 更新防盗链配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxAntiLeechUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update AntiLeech + tags: + - Website + /websites/list: + get: + description: 获取网站列表 + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.WebsiteDTO' + type: array + security: + - ApiKeyAuth: [] + summary: List websites + tags: + - Website + /websites/log: + post: + consumes: + - application/json + description: 操作网站日志 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteLogReq' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.WebsiteLog' + security: + - ApiKeyAuth: [] + summary: Operate website log + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + - operate + formatEN: '[domain][operate] logs' + formatZH: '[domain][operate] 日志' + paramKeys: [] + /websites/nginx/update: + post: + consumes: + - application/json + description: 更新 网站 nginx 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteNginxUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update website nginx conf + tags: + - Website Nginx + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: '[domain] Nginx conf update' + formatZH: '[domain] Nginx 配置修改' + paramKeys: [] + /websites/operate: + post: + consumes: + - application/json + description: 操作网站 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteOp' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Operate website + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + - operate + formatEN: '[operate] website [domain]' + formatZH: '[operate] 网站 [domain]' + paramKeys: [] + /websites/options: + get: + description: 获取网站列表 + responses: + "200": + description: OK + schema: + items: + type: string + type: array + security: + - ApiKeyAuth: [] + summary: List website names + tags: + - Website + /websites/php/config: + post: + consumes: + - application/json + description: 更新 网站 PHP 配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsitePHPConfigUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update website php conf + tags: + - Website PHP + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: '[domain] PHP conf update' + formatZH: '[domain] PHP 配置修改' + paramKeys: [] + /websites/php/config/:id: + get: + consumes: + - application/json + description: 获取网站 php 配置 + parameters: + - description: request + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.PHPConfig' + security: + - ApiKeyAuth: [] + summary: Load website php conf + tags: + - Website + /websites/php/update: + post: + consumes: + - application/json + description: 更新 php 配置文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsitePHPFileUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update php conf + tags: + - Website PHP + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteId + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteId + formatEN: Nginx conf update [domain] + formatZH: php 配置修改 [domain] + paramKeys: [] + /websites/php/version: + post: + consumes: + - application/json + description: 变更 php 版本 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsitePHPVersionReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update php version + tags: + - Website PHP + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteId + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteId + formatEN: php version update [domain] + formatZH: php 版本变更 [domain] + paramKeys: [] + /websites/proxies: + post: + consumes: + - application/json + description: 获取反向代理配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteProxyReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get proxy conf + tags: + - Website + /websites/proxies/update: + post: + consumes: + - application/json + description: 修改反向代理配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteProxyConfig' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update proxy conf + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: Update domain [domain] proxy config + formatZH: '修改网站 [domain] 反向代理配置 ' + paramKeys: [] + /websites/proxy/file: + post: + consumes: + - application/json + description: 更新反向代理文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxProxyUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update proxy file + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteID + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteID + formatEN: Nginx conf proxy file update [domain] + formatZH: 更新反向代理文件 [domain] + paramKeys: [] + /websites/redirect: + post: + consumes: + - application/json + description: 获取重定向配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteProxyReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get redirect conf + tags: + - Website + /websites/redirect/file: + post: + consumes: + - application/json + description: 更新重定向文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxRedirectUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update redirect file + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteID + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteID + formatEN: Nginx conf redirect file update [domain] + formatZH: 更新重定向文件 [domain] + paramKeys: [] + /websites/redirect/update: + post: + consumes: + - application/json + description: 修改重定向配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxRedirectReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update redirect conf + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteID + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteID + formatEN: Update domain [domain] redirect config + formatZH: '修改网站 [domain] 重定向理配置 ' + paramKeys: [] + /websites/rewrite: + post: + consumes: + - application/json + description: 获取伪静态配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxRewriteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get rewrite conf + tags: + - Website + /websites/rewrite/update: + post: + consumes: + - application/json + description: 更新伪静态配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxRewriteUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update rewrite conf + tags: + - Website + x-panel-log: + BeforeFunctions: + - db: websites + input_column: id + input_value: websiteID + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - websiteID + formatEN: Nginx conf rewrite update [domain] + formatZH: 伪静态配置修改 [domain] + paramKeys: [] + /websites/search: + post: + consumes: + - application/json + description: 获取网站列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteSearch' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PageResult' + security: + - ApiKeyAuth: [] + summary: Page websites + tags: + - Website + /websites/ssl: + post: + consumes: + - application/json + description: 创建网站 ssl + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteSSLCreate' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/request.WebsiteSSLCreate' + security: + - ApiKeyAuth: [] + summary: Create website ssl + tags: + - Website SSL + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - primaryDomain + formatEN: Create website ssl [primaryDomain] + formatZH: 创建网站 ssl [primaryDomain] + paramKeys: [] + /websites/ssl/:id: + get: + consumes: + - application/json + description: 通过 id 查询 ssl + parameters: + - description: request + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Search website ssl by id + tags: + - Website SSL + /websites/ssl/del: + post: + consumes: + - application/json + description: 删除网站 ssl + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteBatchDelReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Delete website ssl + tags: + - Website SSL + x-panel-log: + BeforeFunctions: + - db: website_ssls + input_column: id + input_value: ids + isList: true + output_column: primary_domain + output_value: domain + bodyKeys: + - ids + formatEN: Delete ssl [domain] + formatZH: 删除 ssl [domain] + paramKeys: [] + /websites/ssl/download: + post: + consumes: + - application/json + description: 下载证书文件 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteResourceReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Download SSL file + tags: + - Website SSL + x-panel-log: + BeforeFunctions: + - db: website_ssls + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: download ssl file [domain] + formatZH: 下载证书文件 [domain] + paramKeys: [] + /websites/ssl/obtain: + post: + consumes: + - application/json + description: 申请证书 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteSSLApply' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Apply ssl + tags: + - Website SSL + x-panel-log: + BeforeFunctions: + - db: website_ssls + input_column: id + input_value: ID + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - ID + formatEN: apply ssl [domain] + formatZH: 申请证书 [domain] + paramKeys: [] + /websites/ssl/resolve: + post: + consumes: + - application/json + description: 解析网站 ssl + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteDNSReq' + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/response.WebsiteDNSRes' + type: array + security: + - ApiKeyAuth: [] + summary: Resolve website ssl + tags: + - Website SSL + /websites/ssl/search: + post: + consumes: + - application/json + description: 获取网站 ssl 列表分页 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteSSLSearch' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Page website ssl + tags: + - Website SSL + /websites/ssl/update: + post: + consumes: + - application/json + description: 更新 ssl + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteSSLUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update ssl + tags: + - Website SSL + x-panel-log: + BeforeFunctions: + - db: website_ssls + input_column: id + input_value: id + isList: false + output_column: primary_domain + output_value: domain + bodyKeys: + - id + formatEN: Update ssl config [domain] + formatZH: 更新证书设置 [domain] + paramKeys: [] + /websites/ssl/upload: + post: + consumes: + - application/json + description: 上传 ssl + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteSSLUpload' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Upload ssl + tags: + - Website SSL + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - type + formatEN: Upload ssl [type] + formatZH: 上传 ssl [type] + paramKeys: [] + /websites/ssl/website/:websiteId: + get: + consumes: + - application/json + description: 通过网站 id 查询 ssl + parameters: + - description: request + in: path + name: websiteId + required: true + type: integer + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Search website ssl by website id + tags: + - Website SSL + /websites/update: + post: + consumes: + - application/json + description: 更新网站 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.WebsiteUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update website + tags: + - Website + x-panel-log: + BeforeFunctions: [] + bodyKeys: + - primaryDomain + formatEN: Update website [primaryDomain] + formatZH: 更新网站 [primaryDomain] + paramKeys: [] +swagger: "2.0" diff --git a/core/cmd/server/web/favicon.png b/core/cmd/server/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6f82a12d56b666914ee686321551411e970d4db5 GIT binary patch literal 9330 zcmeHtc{mi_+c#qfLm0BljIX`M7Ky?%24i1RBwKc)vP|+-7$a-M*fm175Q$Kxg{YLZ zFp`=g%Sc&5)?s>&e%Je6*Zc2#J@50^^T%A*%$alUb8qLq@AJ7&ik*!aKd&S&8yg$H zIS%W<#>QR&J`8RyFmi&v4F=eFLU3mZY;0medmr{5#Z@CVHUyhF_N3##w->&AxpdCy zYS*%f<->lFQ&Qaa0*a`~EenD2+hR8eoa@rx?|f%3I+RRsN30ycQsW9tQbpgNynQIS zQYv}4$xGu1{L?KP-hs3cFFE2{zs8FEo^-jaYwC+F>&*JKKQaS|qb8@K-mWbhKJWIK zWMljONrA=5#wIC<V`DqOEzcIq3x%_x6Hc=vVrPCQPW>F9qGstVAMKBfIcR4{&wgi2 z@Ub?f^OvnzIUKX}FWmvZl4lPDB%&b@F#Fs9b>9G0*MDcU<oN8OwdwWfVvjoqAv^(h zbfw305LX{Fh~eXUj}0XFi+`QqSQWyd`5)R&=g%7Q{@b>H=JOCoaggUx2#@pL^tJIY zRVKEyEz8r3$kWP3g7zVpSi|J6m$vjIx2_A$tFw=rAlPT$8fF^l>DF!0=eM)N2dIUx z{rZkF79Shiq1+H2!QAMwYdZO}Y9}V6JM4d%5W7T~mVnf4a&*~!uJKEc7;bU7A)ha8 zqI#Fq4HzEKN;$G!^Vg7PY900);u}hE)0Vt32x})3D%|_8@_tghTqTQZSSo$#?YPr5 zVxX4fh2<Yub8dN&DqZPd9lFxW$=?k(XH_Pa{P=`!oJ5q0yR=ot7f((V91Al;Ag{4c z#bnWiv#!~kYg~W87Q`*@Q|ka*KG|Oq>h$$jwpwOObf-YW4KyaN?h7YxLGBxIIiDmn z<_w;Oxm|^qe0*4aJJ{%P5KD>XijacBACf;yMZS<Wz^i#4BteJ6JbvI?f8+W&t^Of< zo_XoQ-4y)c%zl5iUOBR-P0gFimV+MqK4B0Yd}=wx_<uvLQ(y%r5htHN!Xv|mXSn4N zTo9gnoM}vzA4AGIVsCj!(A?^a0g1CPJp}m<Z^>r<OI-_RQ^ZOBb?m2(VyQYg@_Rj- zo3A@+u+GMa(j)X*b3oDgBm$|YC~&zvr(3ik6^(Itrg9~f0t+xjAbIXO{lxThYRi!Y zPxAyv<r+|;gRZ%LV3w1`AUyUt4cgjMBA-j2oevJ*d@tGbp&|8z5H6r-UijinlwMO; zkqTj>;@E|_dN63s^Cnfw1`{HxWF8_d>xLvZG{e<Ax%zG#SKs)hLv`eF<CZ_Hun}s+ z-n7Q(4v&0zBh!W(aDd|}DVDnQTlf5>E7HcnnGjOEsYSIO_c30Xd-0W)U4o^+^ICF# z@#uLTX-6>@*K<O$;B!JaXXTCKs_YSWy)<+cQz)?Jo9Ip}1sX>C_WgW}nppg7DFY%V zNB(7?KsV+oxSvlM5whqzgw=rX`149`4EsEC&$rn8(2b3_jU<Q2ZRlpk?(Vm?_?TbL zfIuDQES&uU|CO_9g4?J$5bQM|HFgOjm<q!#nRAN~Pp#BWdqqMW&RZP2_j#pN_I@=L zeTBOs&JLETfL9~)Lu%M)7?IL=O)Mi%b&!vg(}?NXJ$w$9DFr-2l$2A0!6PY$nK|*m z(pZFVq6@cUjsu}Xyv#}vck7NQgpd>BQ$k7Q6U24phIn;<Y?bY=rpDr-S?6gOMC?qX zZMerinya`8LIR6|y8Oz07I;p|IA`s0=8zCBQAB&ujDW(b^(|8E2$|}T?$|i6Th23N z8uh7P6Bv?(nCsz@@3RgsEkLDzlrk`y5ObBi0XapfocCd_5QzD$*veYCUjfo8v}wGW z+He!?5a+_(T)jE>k=;p7+_-{`RKeCF7{If8@_+)L*Z@C?hV0tCqj1=u|73rH4AfyC zZ%snLlkPMPS5_Uc%r1AutLg-_<*_zt<%tNgCN@P7mlA)QRVoS*vm=bwwNrHsk_lS3 zm;wI(%%*;%xyqvvCTBW#xx04d%l+uKM8Z<p^<zrCNoL2TzzLflzmC3f9WaFJuUcg> z+>1CMO8LzhSB{3sFf98`<e?5w8s?4yeqG%svcCJ|ZH}{Dy<6e^hVH%G6`}{U7n59) zTOFezOTmjMLehoN?<}~Em<)pKVrPfKX1834w<qko+fE&wF8D3?56|7(8>Tf>XE>=D z3Unl=6Vbn2c&%}fEYtJVVW7$k`~@M2C~sKX;gMPPgi)*Y6bCx;IC=PAz3~T!Vv0Sv zAvLA&^pvB|2Gcd}EmGEWH=eW_KRVQrvkHad)g%#Qe3>W&<*=$aGEN`X2nvz!$oZLO z+9f!GMWE2Yx)pvBX6q^1Uy#Rhj0N;;8><*z?2y28c%r7(q7n~aM|CQu`784H7TSNl z;FyjW3Q1P`yN;pUkj88bOS<3`r!uP$j8_{#l2w5fQfYLZ>}a{#2oRqupScQfY9?04 zq2W}ggQsAbX_Tja4{dW^$~-jI`|TOZC!{0BFCvRWR{4r=T!&R}Rh%1B>RH%7<^;E* zx%%Auh~8s<$Ps4WDWg@ZBW4{VmRd(uRwM82Q#XQ{p1#l`w@OJZ>k>S007q>XuTH>q zg`u#Qs;O^rLL^5!)T=En+h)tpttGx7+8Otoa6Q~Fzo%#G7C}0)5VfI+Rhy-x9_CP) zIMnz$)QE<uu*ZP)7S&XZQEfM~D<oRTT+ei6bK+`~;N4d)$#gryd8?zOy>n6aqyDT} ziy&2{lF_*%F1Px3u;RXG+;N`;)$@Fra}?MxDTnzzV$aKJL?@p_X)*Snm8Q8W`)Tb7 zU`hL;bHq*{6NXn4(K>(wE@g5rV?g!r``+Bwl++6wz1C2NiEd#$GDPT9M1LzGr!TtP zJNco$eVrjW%&72PYl)9lhR3&NH#p7pveiX|J&cs+b1Jqgy27XKgRA!0$<vXaoZa?@ zMSb-;OH%l|)26ZR152oT>kcDO2Oi;&ngrb4<g6yllZ+>({U#VyNX;D=a3)^)uCrci z6>Jwlb;NisOYU)|zzD8ZPj#>Gv5+vPbsxnkk#c&u=qG3x`Rvzx4<3npl>VGc4^q?D zQ_j;ShaE5bH#7D#joW*%{;b7rzd_rrH)j1Ny;+=aaH!4m3^X(yy9AdhX|*|&)bFxv z<@@%=Q@Wq}Nopi2OQd=yJKpq86~&qGL44@8s*FWSAhyy(i{=_{m@fWT%U)OM8D}20 zzltZfR#UmRn4kIfj0z`2^w*U#<Rnsc#ENo@AHi`7v;_y?bRaP0X(lS)dN(t{p(D1+ z8t{dv{HjR2;WzL^d?VXR2zYoIScX?)?7EfyX9K|bKs6QD8P;#|W#i?Y@t<8Jk%r5@ z;dFt*woqT-$sp8bjpbe!(0d@Rqxz~&2G=N?%(bTvU*JCC#yNaCV#7ue_J{+Hu)%3Z zo=%O$HwdsqxsB0@;@#smOD^cIN5U)9kWYSvd`=*V{0dJCHEP8z1E&IF+>#4Y^W${* zlD%Iv2<a?ld)*~Dty?qn$LY!5=M1k1ElIjQGnj)T#f7`iYq4IU)1Hut9ncZ8+|zPF zf=e<6h`gsv(P$y={qlc&>W(b#o3(?HghBlCZedLJ!dMR`(AxvVYKa!X?t-U5iJL&; zF2{b8B3Ek8I`Z{Q`@!`@??0)(q&k&ViKFw+y8}X!G&&<=%;y69UlQeFJlanFv!B>^ z)uYS67g>nT;%|=bD#Ff;yM8T6<N7J>@<L9lcHwSRmYH;n$IcXs@zs0F4^P=buQ0LC zzkMtj`BPvFv)|IqEtGaa3&-gFrRu!XI3JDJ-+p4-1cc?%`I%eI_%#wxIA4n(>25aq zOnM3Z>^0WYYk4+iE!IaTg6#=HMMR@#U&iT2oCx0z#~5ctm!Za#<kBYfK&^KUL|d&Z zKbPn1zdMZ*Hh+KO8uM6r*O4@@ZZeZGVU%~x%ddb}eoJ9|w$0d)Wj*;4$e0~n#_-`8 zGYT$o|Am@(^vqnu$O7=@eQrJ9l=q-b{m##&VIa&uhnSX%kU6@#9uvEq=2McKUY586 z4+}oFZfWmv_}I5Ok9JuQj@Jnv<J}YI)wcw0Ej6@@j67Z8-zBXFf4|33)1j`HH#N@p z^;Q~J1eN~D%9m#=^kt)C@WZr-9sxmvPh-En?ZD2eno1iljK3e@a+pxpqb#@Yw3DOd z^lwOJr7S<R71`-8@;&kGkeCl~&X8$2=-6I5KDa(X<IMV_u*Cm{Y01j+HvH2Y<FTId zT^av2<7B47^g9=QRF{@}0-unZKT$>X&y!uN_52SlCzN$aBH!|*#iY8eIwy@XbrpIE z0zQgPX$n4h%kf5vYD~+e#&(fhq6|@mX*v2dMne@6xF#F3mLWv!4#hjAhZ3rkV-F*j zlw2@vC`;1oZ12g(;>IFh?79TQw=bHTAnqIdS@<#Izpq|5QuEBOkT3#bD&|sX+EYEf zZ)30FTD>C&ay79VBPXhNHb-5n#<OUL$K0-N`A5ur&%fR>+kQOk(u!k;aZg9|*<x?H zt#MfAYUb@<K0IgH^%UC_yps*pcembVJ{dfD=#A}mzB{YrxcgJh80yvNI}^yWSQHi^ zvC;IJ?Ec(`Z%_uWwo<<GF(P<n2r%_!qGwRuZE56G-tv!fQ7;~=w8xeIsh7UDi64*r zR)1o5ZQ?R<PC>nO?Cw-dbpp5Dn39**vy*^bP$&6&U4B2u8X~%$i(XzkHLGaGdoW9} zL}O7YZC=>Gr{t|6*v#`@jMv(0+4_2Eqfm9VKi_{k9WrVyoj``CxFn;8UAPl}Gm<E< z&wXpit=-DrcdXT}T1%%dslCBb2Gq-y&7S&Xgjb+itX0~$U!Yp>kU{t<Q>`yk<Da>j zZZ_t-8-zO*vwn1aYWlN%m%Ll~qgA%Ey40dcLwE`%_vTd%RiiU1VXLS2PxQiNVqnyF z`m_|MfJ$N@3OW@dssGsa)$#<yo^U>CjCXbQjK|KqmfR^Ls#rd;V3;*jPgn9vvog+& zmdgtY=^S-^%NlZ{26eHrv>5Hk(_7w?F~qs)g3VfgkDrk~H|=4K@k<|)giSZqB#fJF z`V$P#at_fz)M{^^ej{k@zH9!b{N7B1)?SU2C`wD>@K^OtuBO__7b-kWeJftZ>Kz#s z$Qb4NWTe9MxPeL!)t%i)@!?6-GSdcvENyRd0$)<^4aS{j6||0ftavA@J>O~S0%pJ* zCi$IjF4am*rljuomBpQ^Vp{IwFwqf9qG968&x&i>5eDyjK?3nEgu!L;GG<s>Az&du z)bs+#o=QIrDkATCC&Ncw?O;N<^w8iY?Ig#65m%6pNRw^I(+YLeV|PU5Tq{N6G%#Tg z+b?HRQa5kxuc%1|VSX=XLP1$gu_Fk{k{p*W_P_2HFZ12V2abY`KDL)z>b*9|3_Tg+ z-%0N&Fgy}sFT4Mcs*YHMPjI$?4QfJah;NvZ+G|U6i{P^dIp#b~aP3>e_W=K?(s^}I zKXF2bAUb%pdo6-#%)n{~ScjodUm2rJ=J43abdZ{w!EV!WKzo})cs@G)dNw1}NORd( zS#Bz3$KlPwPzh|hV@dsVm*7_H)qLV7Kkf=HAZk?q>)PB=7Hg}$Z8zBO;4?Ta>7R(9 zGuJHRQfhhm1##><n#;LUFUJe7O~{lRN++CGry?OdgIm#ZiYgq=@o0=T4Z{`?cj`(q zCOz~NjQtL{Lp9RRKj20S@4*P15FWNW5E7Klj)aD=RihE?Y>o&r8=LC?jW+z(PTRvS z1Yi1Sw;uSJvcUg_^^O%sJcdw@GX8Jl;J;R$|DpE()m{Ey)tm6tdyT}AT&pYXVdQ=- zx~PgO0a2mv+wFh83(5jitr1)7`dZ@DwE^nxREyN(5|7AXYc;nmlr6!aR`g(nSFrwU z+xOtb1^wB@g9{ht^I7q1l|O*HzMSKT^f<PRpHZhb<(9NHhV4uTENl@sZWp@FaB4}7 zlRquj6Bc#BJ_}%<HR%`x+Zur03ZH-5%={DL!e4$bzjl=QZadh`z+FmurFp;<(ejhy z&*|sw)Clz|S>6{LThV0z;#x3D>q#1-Dn36D@oe2`w0MoU=<arPVdF&QxEZ2li9%TX zTdS?-$DROUJY~JCisHWLGjxvd?!nicZ`~}1;DlhS15k$(!M&`Zmw=UiS0e6?d`wBT zuC&pWfoN4(!|O%!>T7@2KP`W{Sv9bh{x4Dpr$W!$twgQovlaT3d@r3Be*T3a5c+I= zd&GbD@wU3tgA7Yzq#$lCYWntS@4pe2TO{_MJ|zK`>nWGsY=`c!hEjWtBsX^}yDJZQ z<ZpK($wMnjA%+XViv|EBd~dy;a<Dh4TOQ17sx^APJlW$xJT=LJlV~?1e2H`HOv_lc zhqk|Q>nUm{x@120=C((HRM;&mtnN=tLI3z*m$&@LA_mUJ?-RL5nioc$=ql=*(_DVM z{oqWD-7BqwB$@%yVfG&h<5yA7uI_|>=70%^9DQpz*cOFzd<_7^_7z>-Vvk+(b*3dW z>tIaa#E~%%FXbue>_JbWmgHvTfIty}K80@h8WIHn!=+xsL5DZ3-q*tCet^PZMpkC# zNjnxXH<i!Zmb0snp7Kspf`11UDQoplivU~|7$JO2X}hjAy38(yZ*aBNsBlp|I(zs~ z8hR)QB+b`~<sI4G0TZ^y&!=vG9%21Ec)zE$M7?ERIAQY&-{3p<-asJa&_(^d+{g(g zPl3rL<sJ>~@u^lpNPry$gli?fT~aSfL%JLxHs+xpo_8TECwot>0w6aDWV@1Gh1TGV zP$pvAnQ3TWJ*<f}lHJ@@n7wLyktG7n(pl0<tS;W;!1{huyJNjRxWMSuQk|o}Oas;V z44Z+gns}Msw01Eu{i`>zMtZhux8REsZ#W>m)pZk)bFxNF3E{4|W$zVKhczVl4|cPL znDgp0_rd+`0=Vo|c_+tcH8>JZBF4Z~(mH!^f^>N5i|%r){kcN0TjSn8GgIrA`GlC3 zO?&mm?N#qt`mBqr(vOt0u*|~XAhr74Ge0v-5i>KAI$~>}jFB1h*zW1{?s^Qs<_zx- zm}y2cWAdhMb2?Ivyn+RrJZx_s5SKeXFoJ0~AvSS=FY_S<22lwfp}_K%8P#dXZS2DJ z!?zOwC~&)$`aOy-GY@_B)m&9I$gb7Y0^{}k#cme-&8yt^&fvOOL)~0?ovX|GIFoT# zj+}nw=)u!AMvWKX`*g%~fUKx7kICx}N!p_rpI7Z&<HR*vUDo1e32}SLjpdBbn+FSu zr57%QJT(N>BtC0b0n|Y+98mG+lU6>t=N}R(I`uf|a&uE7vAHQUf7o`=I!Nu&m<Po+ zJ*BFis=QKo)|Z|^b>a3lg=5df)VTB-J6)^pP@j@nxKP)-aMiG=Yn5F`EOoEU*`i%- zZnCE-%vzwZnNu<F71@>X)d#-q+V>YaYK(j%nwyr<hDBjd4G#iFZnzRcS87h@)u(29 zqvA2F>jO;Ijq4saK5QebrJ42f>Y+~!>vbiJ9Wx$K1C|l#f4bI+J?^breyE8_tk1QB zmBtfqex*IM)wT`Rx)rtbXOaKS_#fG#&$+gVMcKB?0?yv)1MTF;yZhq$hy#_I(E_vd z4|Um|hu#oRIA3EiQ{8I~-!68mqBW<tKKXTGF0-zuQ!1(YRIe4Ux_R|4(^sM|(_CqS z&U;+8RA}fs!A^?5CV+OrW9>!Ze($ReF9!#>9{-#wXO!I~=!i8LDsL&w$}$zcXSGEF z&x<GaM}L2y8t_$#@@D5d0@&zEbX2fYmtbSNc2eC)iBa-u?!539m5`ETm*h>u%;>U< zy+-lfpqTXG?KsM`w3q22^s$B@G3`Dxn;8-5e`Zj_!6MeEPfo@`J4wH;v3^&rS2f$z z`-tIAX+2&zSkhCr5;StI@?wwo(RN$;_K2Ou*Wrkhzu)(8Tw>b2d?GtLIAEN*XVf+~ z4+_4Y(>s~h426X&iB<WQymb&Cd2()aT52fgUU_`@TfZGq-52Fj-I{)R%e+HU>7%|p z`Qr~-O;_%}?OV!^O1bqo0shP<qIev8N@ri7kY3xf*DMFeq=%2OBPI-=$V-LMW#6yN zJpa(wP34kxz;h18^y@AdN0#+n_}GK6|Ij*hoE&WFmv_Lf<Z#EY<07M^XYG`+@>~Ix zbNpTCo74Np=ZHrCkST3}vTwDDZ$b0Rd+DMXOFk)&E6NA-Y8#=~XNrovbRM0Eu<fkA z<QJuWL7lIn$K(BPYbN3BRP&?uX4J+7!FNhwav8e{*QcLPurslPx2_4SMf6Lig%wIY zB5=&nJw8rbGuv7&=kHct%tMsv=h&(Kuu1o2x76UCQnwjD^2nC9Etcm(a*SlN{@N@s zqpsV;ItxPcGjmsuZdO+JvSMXGEA+Ys<Ezr4bNb=qN<m2%%h6%yOA7iF+UM09PY8|A z!mZ}jRp1SBaT*L8)i*4Mp<`rKfx5ZEbzE^&5Yv+8`pT?70Ro^O??pBLdlw5Q(E3ac z7yA1liyzO=K1r^9dkMi0$@3KKq6bdL-io(OSQsK*Uf-u<wBnE7pA9ylN{!b`M|l!e zNQr=N@5MGhCnur{OkV5?;d5WbCzV@cT?ILtrh9ytAPz~T4c~Y-*;=9~e9?vf^BIo0 zd4Y?DpL^&=Agq~#OO6%*iZwURpL@x?k^?w-S@`9LVa{`fQ%BwdbSF*|Ygr}=5V96Q z{Fz5(Ttj0XLl+ivM>MffKhlDo;=22)Z1@2t7T+yEV_)jGe|gj#LEUc?beTj+^{J*- zlU$O0`rHC}^kj<UE@X3p<sYMt<WgX+@sw1FJ@C~F75{@--VL}?zZ5ey3S2be_@q8L za8g>hN>nZvjz{YAd>(*wn-r&1aO#M4i?|U6LwLBp_3@`)DhCs6I0A2gR!epD-Zd$! z(FJz?Ugb#>gta{ZfSX2%;F$S<ZE&X%);c>k0$Uhyy4jl#>!{#v#sf&-(IVe2wQltV zT?i{t9Wh`NV-(hm#x*3OBNmX^{l95u_UlNlk+dt<<eUnDQYO*+4XQnElmflrkvST| zxKp1@-I}e}^IK`+B|j*siNg6pUG#mU^?0O%rWh_A@D~JPZKzW(0mMixfX+RXJ#$fu ze7BnVB8zsr6UYGwi5!u^onkMMu1iOH$y*)Y?@P6L9TXdCWNrsLj}|3O^E#gkr@1zp z^vmx9k{&x0*%w96sA(utC`41r7?2~?x5B~E)-s`CoME3MAHphXVlCs(1gVJ|YnM<0 zC;rM7Z$HL0<fx`w;9tt{Qal}Pp2jrq{Lxxcr!=IU8I91xt65aswa)`eJNyCTvwL0- zD@4*Z={H%wqL8d_<O?tnEgHtBq8d%%-K60g8D$j;aynD7K*J!b@g0!Boywz#7>n2u zLa+4Tx>ux=tR{~{WN3KyzM$vkJQ9)F(?u@`D7crJm+;7;1{aupgkmYR;o`YvlJ<dr z=Z8Ltmq{P}*m9Hk4PhPydRB30{i=BOM1TpWmg8x(ti6^1fZfMD`Z7|`6cPn?nkMqo z9t7Tg^O0Na{uO8h==hk-(i}7Xg8*{=L&kF#82E*QWNXW!bnR-qKgy3sq7gco%oGXW zP&7==8+!PS7unRiK}ZKASrS~nCGp4}2MbhuO~ZmD=%q}&eK0~v{kRcSouDkxBG|ea zsYuQ{)#-W<rz5s6%(Ha$lqpbS7f|EmUlJ~uev^xPbnz(c2Yz-*AsniV;e`Z5jZx4a zMjKEEro|>@JcMtsUfTKnUtD1m!27F24v0!I{3u3@<{D6&;7PZQV%X&7g`m56Au1$D zkQ&%NW5y-<!h;adM^$hbMV9NZu|dW6-U4*`>Pr}3c8UY;9tIHGD=ateie_<LxGVr_ z!S6FdIGOVZZ|2{q;)TMlU(X_-5#ec>YYYE52!aPd1Fh2i+h0R+W6cmMo!eKU_o8Cc zp$CohH@gkCwV=l)s1(Zp&YI$YM_MIZT;!Iogs6r25zXRUlI4K}{@n62kaUegsj-LL zpnu({zlYj@7NTj+G5=KHQ*|FOBD*J1X3#9nN-H_gM}yNa=mU`MJMg2yXYZz_yKq+< zBP7m%-tTjh`%U_bRo!7aQ!#0BWG%bSF17x8%O)3CN5XQPAWnkk*fxcELdy=uZp>ZL zm!pBz^7Oh|1DsY{W&<2yQ|=0@TsuOC$=EH6O>#$T37-(|)}iw+<jdm+z?xz13P?_a zqHF_uF=&^NIUzL&h1)Kw4e4?l<vYOZ;?b&hJUU{WBI~&hu=A=H8l@pMp6t5g_Yca} zANT8mfHf#cO^8At7fk$BO)hXq>%}h3#i|e}+$KlEK+h9;Q&i!^D5GlFI}!?SE05QO z8)v_&NkH3k%eyLXaM{ebS%M}B4hr`JsEqI#TW!B<$GGMMan7LNmbYkKH9<ic;C;b4 z9x=(|;>MtPq!E1)^s`krGSyS?YF27)oI9US!APID<)Pppt59vv_|pY|UYvP##BKrs z`>s6)(~Vz_g(@@`oUw<o(;~ls0ho^1xc8c;*@x4c??KP~XEpVhJs>_6^Ij1^H6ozi zci~3-Zowgtk75gV&b(pF`x_djgc>D-mj>`Y{b7X-0iK2w(5$z*z9`xv_&yDdQTm9s zO%;GN#G)}(VGpR^U0yh-0D2M-o}xpgj4~M2<BVwxw|sR+0p$u{tQLHIiFl_$+CxQS zC82Oy&vQnZ^$Dl9>?G)j_==wFxMHR-gh#PKeZ_75G13eQw^G@icAiMV;*p*JA0mKG zTPt_OBl2+wk6*4<bZm{NGA9YT8dmg9)DG6sDq8^h_fk}=20tx*3ljwL(1-Cpp!ja^ zf}-06rrILNMvCtXG!jH~P+zyo0<MwGGPl&$zUylUkm9`pK;^kT<L)U6;dwoWpSO82 zZi#~4z#vMUYq+wt5Te!Kk;O9Po)ms*1_(nlL$C|kJO%322Hy_!esFbu`Ue_-L9mN) z>+#Iqemd45>XqtEfAN@G-ZL>)6C1u~8USs<pfuOM&Q@8^{ScmN70<79krqKTKNSAn z?)n}w$p+vwG~1ZRCrW5C30MR?Lpl5{&iiW`lN|yc!oYlpfhEy$2<bhv>>K<KA9z0W lf1cy)VHEETX6b)8Zr+l2uiqDX6FeefGdHop)?+;5{udWKdbj`p literal 0 HcmV?d00001 diff --git a/core/cmd/server/web/web.go b/core/cmd/server/web/web.go new file mode 100644 index 000000000..dc7a3d3b0 --- /dev/null +++ b/core/cmd/server/web/web.go @@ -0,0 +1,15 @@ +package web + +import "embed" + +//go:embed index.html +var IndexHtml embed.FS + +//go:embed assets/* +var Assets embed.FS + +//go:embed index.html +var IndexByte []byte + +//go:embed favicon.png +var Favicon embed.FS diff --git a/core/configs/config.go b/core/configs/config.go new file mode 100644 index 000000000..7d8116b68 --- /dev/null +++ b/core/configs/config.go @@ -0,0 +1,6 @@ +package configs + +type ServerConfig struct { + System System `mapstructure:"system"` + LogConfig LogConfig `mapstructure:"log"` +} diff --git a/core/configs/log.go b/core/configs/log.go new file mode 100644 index 000000000..8fe60a91d --- /dev/null +++ b/core/configs/log.go @@ -0,0 +1,9 @@ +package configs + +type LogConfig struct { + Level string `mapstructure:"level"` + TimeZone string `mapstructure:"timeZone"` + LogName string `mapstructure:"log_name"` + LogSuffix string `mapstructure:"log_suffix"` + MaxBackup int `mapstructure:"max_backup"` +} diff --git a/core/configs/system.go b/core/configs/system.go new file mode 100644 index 000000000..57a24be67 --- /dev/null +++ b/core/configs/system.go @@ -0,0 +1,25 @@ +package configs + +type System struct { + Port string `mapstructure:"port"` + Ipv6 string `mapstructure:"ipv6"` + BindAddress string `mapstructure:"bindAddress"` + SSL string `mapstructure:"ssl"` + DbFile string `mapstructure:"db_file"` + DbPath string `mapstructure:"db_path"` + LogPath string `mapstructure:"log_path"` + DataDir string `mapstructure:"data_dir"` + TmpDir string `mapstructure:"tmp_dir"` + Cache string `mapstructure:"cache"` + Backup string `mapstructure:"backup"` + EncryptKey string `mapstructure:"encrypt_key"` + BaseDir string `mapstructure:"base_dir"` + Mode string `mapstructure:"mode"` + RepoUrl string `mapstructure:"repo_url"` + Version string `mapstructure:"version"` + Username string `mapstructure:"username"` + Password string `mapstructure:"password"` + Entrance string `mapstructure:"entrance"` + IsDemo bool `mapstructure:"is_demo"` + ChangeUserInfo string `mapstructure:"change_user_info"` +} diff --git a/core/constant/common.go b/core/constant/common.go new file mode 100644 index 000000000..eca15f1d0 --- /dev/null +++ b/core/constant/common.go @@ -0,0 +1,20 @@ +package constant + +type DBContext string + +const ( + TimeOut5s = 5 + TimeOut20s = 20 + TimeOut5m = 300 + + DateLayout = "2006-01-02" // or use time.DateOnly while go version >= 1.20 + DefaultDate = "1970-01-01" + DateTimeLayout = "2006-01-02 15:04:05" // or use time.DateTime while go version >= 1.20 + DateTimeSlimLayout = "20060102150405" + + OrderDesc = "descending" + OrderAsc = "ascending" + + StatusEnable = "Enable" + StatusDisable = "Disable" +) diff --git a/core/constant/dir.go b/core/constant/dir.go new file mode 100644 index 000000000..931b21c22 --- /dev/null +++ b/core/constant/dir.go @@ -0,0 +1,20 @@ +package constant + +import ( + "path" + + "github.com/1Panel-dev/1Panel/core/global" +) + +var ( + DataDir = global.CONF.System.DataDir + ResourceDir = path.Join(DataDir, "resource") + AppResourceDir = path.Join(ResourceDir, "apps") + AppInstallDir = path.Join(DataDir, "apps") + LocalAppResourceDir = path.Join(AppResourceDir, "local") + LocalAppInstallDir = path.Join(AppInstallDir, "local") + RemoteAppResourceDir = path.Join(AppResourceDir, "remote") + RuntimeDir = path.Join(DataDir, "runtime") + RecycleBinDir = "/.1panel_clash" + SSLLogDir = path.Join(global.CONF.System.DataDir, "log", "ssl") +) diff --git a/core/constant/errs.go b/core/constant/errs.go new file mode 100644 index 000000000..411387d3d --- /dev/null +++ b/core/constant/errs.go @@ -0,0 +1,164 @@ +package constant + +import ( + "errors" +) + +const ( + CodeSuccess = 200 + CodeErrBadRequest = 400 + CodeErrUnauthorized = 401 + CodeErrNotFound = 404 + CodeAuth = 406 + CodeGlobalLoading = 407 + CodeErrInternalServer = 500 + + CodeErrIP = 310 + CodeErrDomain = 311 + CodeErrEntrance = 312 + CodePasswordExpired = 313 + + CodeErrXpack = 410 +) + +// internal +var ( + ErrCaptchaCode = errors.New("ErrCaptchaCode") + ErrAuth = errors.New("ErrAuth") + ErrRecordExist = errors.New("ErrRecordExist") + ErrRecordNotFound = errors.New("ErrRecordNotFound") + ErrStructTransform = errors.New("ErrStructTransform") + ErrInitialPassword = errors.New("ErrInitialPassword") + ErrNotSupportType = errors.New("ErrNotSupportType") + ErrInvalidParams = errors.New("ErrInvalidParams") + + ErrTokenParse = errors.New("ErrTokenParse") +) + +// api +var ( + ErrTypeInternalServer = "ErrInternalServer" + ErrTypeInvalidParams = "ErrInvalidParams" + ErrTypeNotLogin = "ErrNotLogin" + ErrTypePasswordExpired = "ErrPasswordExpired" + ErrNameIsExist = "ErrNameIsExist" + ErrDemoEnvironment = "ErrDemoEnvironment" + ErrCmdIllegal = "ErrCmdIllegal" + ErrXpackNotFound = "ErrXpackNotFound" + ErrXpackNotActive = "ErrXpackNotActive" + ErrXpackOutOfDate = "ErrXpackOutOfDate" +) + +// app +var ( + ErrPortInUsed = "ErrPortInUsed" + ErrAppLimit = "ErrAppLimit" + ErrFileCanNotRead = "ErrFileCanNotRead" + ErrNotInstall = "ErrNotInstall" + ErrPortInOtherApp = "ErrPortInOtherApp" + ErrDbUserNotValid = "ErrDbUserNotValid" + ErrUpdateBuWebsite = "ErrUpdateBuWebsite" + Err1PanelNetworkFailed = "Err1PanelNetworkFailed" + ErrCmdTimeout = "ErrCmdTimeout" + ErrFileParse = "ErrFileParse" + ErrInstallDirNotFound = "ErrInstallDirNotFound" + ErrContainerName = "ErrContainerName" + ErrAppNameExist = "ErrAppNameExist" + ErrFileNotFound = "ErrFileNotFound" + ErrFileParseApp = "ErrFileParseApp" + ErrAppParamKey = "ErrAppParamKey" +) + +// website +var ( + ErrDomainIsExist = "ErrDomainIsExist" + ErrAliasIsExist = "ErrAliasIsExist" + ErrGroupIsUsed = "ErrGroupIsUsed" + ErrUsernameIsExist = "ErrUsernameIsExist" + ErrUsernameIsNotExist = "ErrUsernameIsNotExist" + ErrBackupMatch = "ErrBackupMatch" + ErrBackupExist = "ErrBackupExist" + ErrDomainIsUsed = "ErrDomainIsUsed" +) + +// ssl +var ( + ErrSSLCannotDelete = "ErrSSLCannotDelete" + ErrAccountCannotDelete = "ErrAccountCannotDelete" + ErrSSLApply = "ErrSSLApply" + ErrEmailIsExist = "ErrEmailIsExist" + ErrEabKidOrEabHmacKeyCannotBlank = "ErrEabKidOrEabHmacKeyCannotBlank" +) + +// file +var ( + ErrPathNotFound = "ErrPathNotFound" + ErrMovePathFailed = "ErrMovePathFailed" + ErrLinkPathNotFound = "ErrLinkPathNotFound" + ErrFileIsExist = "ErrFileIsExist" + ErrFileUpload = "ErrFileUpload" + ErrFileDownloadDir = "ErrFileDownloadDir" + ErrCmdNotFound = "ErrCmdNotFound" + ErrFavoriteExist = "ErrFavoriteExist" +) + +// mysql +var ( + ErrUserIsExist = "ErrUserIsExist" + ErrDatabaseIsExist = "ErrDatabaseIsExist" + ErrExecTimeOut = "ErrExecTimeOut" + ErrRemoteExist = "ErrRemoteExist" + ErrLocalExist = "ErrLocalExist" +) + +// redis +var ( + ErrTypeOfRedis = "ErrTypeOfRedis" +) + +// container +var ( + ErrInUsed = "ErrInUsed" + ErrObjectInUsed = "ErrObjectInUsed" + ErrPortRules = "ErrPortRules" + ErrPgImagePull = "ErrPgImagePull" +) + +// runtime +var ( + ErrDirNotFound = "ErrDirNotFound" + ErrFileNotExist = "ErrFileNotExist" + ErrImageBuildErr = "ErrImageBuildErr" + ErrImageExist = "ErrImageExist" + ErrDelWithWebsite = "ErrDelWithWebsite" + ErrRuntimeStart = "ErrRuntimeStart" + ErrPackageJsonNotFound = "ErrPackageJsonNotFound" + ErrScriptsNotFound = "ErrScriptsNotFound" +) + +var ( + ErrBackupInUsed = "ErrBackupInUsed" + ErrOSSConn = "ErrOSSConn" + ErrEntrance = "ErrEntrance" +) + +var ( + ErrFirewall = "ErrFirewall" +) + +// cronjob +var ( + ErrBashExecute = "ErrBashExecute" +) + +var ( + ErrNotExistUser = "ErrNotExistUser" +) + +// license +var ( + ErrLicense = "ErrLicense" + ErrLicenseCheck = "ErrLicenseCheck" + ErrLicenseSave = "ErrLicenseSave" + ErrLicenseSync = "ErrLicenseSync" +) diff --git a/core/constant/session.go b/core/constant/session.go new file mode 100644 index 000000000..94fdf462d --- /dev/null +++ b/core/constant/session.go @@ -0,0 +1,13 @@ +package constant + +const ( + AuthMethodSession = "session" + SessionName = "psession" + + AuthMethodJWT = "jwt" + JWTHeaderName = "PanelAuthorization" + JWTBufferTime = 3600 + JWTIssuer = "1Panel" + + PasswordExpiredName = "expired" +) diff --git a/core/constant/status.go b/core/constant/status.go new file mode 100644 index 000000000..e3b8fc05b --- /dev/null +++ b/core/constant/status.go @@ -0,0 +1,6 @@ +package constant + +const ( + StatusSuccess = "Success" + StatusFailed = "Failed" +) diff --git a/core/global/global.go b/core/global/global.go new file mode 100644 index 000000000..5d66ba05f --- /dev/null +++ b/core/global/global.go @@ -0,0 +1,26 @@ +package global + +import ( + "github.com/1Panel-dev/1Panel/core/configs" + "github.com/1Panel-dev/1Panel/core/init/cache/badger_db" + "github.com/1Panel-dev/1Panel/core/init/session/psession" + "github.com/dgraph-io/badger/v4" + "github.com/go-playground/validator/v10" + "github.com/nicksnyder/go-i18n/v2/i18n" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "gorm.io/gorm" +) + +var ( + DB *gorm.DB + LOG *logrus.Logger + CONF configs.ServerConfig + VALID *validator.Validate + SESSION *psession.PSession + CACHE *badger_db.Cache + CacheDb *badger.DB + Viper *viper.Viper + + I18n *i18n.Localizer +) diff --git a/core/go.mod b/core/go.mod new file mode 100644 index 000000000..3ef520d39 --- /dev/null +++ b/core/go.mod @@ -0,0 +1,105 @@ +module github.com/1Panel-dev/1Panel/core + +go 1.22.4 + +require ( + github.com/dgraph-io/badger/v4 v4.2.0 + github.com/fsnotify/fsnotify v1.7.0 + github.com/gin-contrib/gzip v1.0.1 + github.com/gin-gonic/gin v1.10.0 + github.com/glebarez/sqlite v1.11.0 + github.com/go-gormigrate/gormigrate/v2 v2.1.2 + github.com/go-playground/validator/v10 v10.22.0 + github.com/golang-jwt/jwt/v4 v4.5.0 + github.com/google/uuid v1.6.0 + github.com/jinzhu/copier v0.4.0 + github.com/mojocn/base64Captcha v1.3.6 + github.com/nicksnyder/go-i18n/v2 v2.4.0 + github.com/pkg/errors v0.9.1 + github.com/robfig/cron/v3 v3.0.1 + github.com/sirupsen/logrus v1.9.3 + github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e + github.com/spf13/cobra v1.8.1 + github.com/spf13/viper v1.19.0 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.3 + github.com/xlzd/gotp v0.1.0 + golang.org/x/sys v0.22.0 + golang.org/x/term v0.22.0 + golang.org/x/text v0.16.0 + gopkg.in/yaml.v3 v3.0.1 + gorm.io/gorm v1.25.11 +) + +require ( + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/spec v0.20.4 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.3 // indirect + github.com/google/flatbuffers v1.12.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + go.opencensus.io v0.24.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/image v0.13.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect +) diff --git a/core/go.sum b/core/go.sum new file mode 100644 index 000000000..81555b5bc --- /dev/null +++ b/core/go.sum @@ -0,0 +1,393 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= +github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/gzip v1.0.1 h1:HQ8ENHODeLY7a4g1Au/46Z92bdGFl74OhxcZble9WJE= +github.com/gin-contrib/gzip v1.0.1/go.mod h1:njt428fdUNRvjuJf16tZMYZ2Yl+WQB53X5wmhDwXvC4= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= +github.com/go-gormigrate/gormigrate/v2 v2.1.2 h1:F/d1hpHbRAvKezziV2CC5KUE82cVe9zTgHSBoOOZ4CY= +github.com/go-gormigrate/gormigrate/v2 v2.1.2/go.mod h1:9nHVX6z3FCMCQPA7PThGcA55t22yKQfK/Dnsf5i7hUo= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= +github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw= +github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E= +github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM= +github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= +github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/image v0.13.0 h1:3cge/F/QTkNLauhf2QoE9zp+7sr+ZcL4HnoZmdwg9sg= +golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= +gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/core/i18n/i18n.go b/core/i18n/i18n.go new file mode 100644 index 000000000..db6867285 --- /dev/null +++ b/core/i18n/i18n.go @@ -0,0 +1,98 @@ +package i18n + +import ( + "embed" + "strings" + + "github.com/1Panel-dev/1Panel/core/global" + + "github.com/gin-gonic/gin" + "github.com/nicksnyder/go-i18n/v2/i18n" + "golang.org/x/text/language" + "gopkg.in/yaml.v3" +) + +func GetMsgWithMap(key string, maps map[string]interface{}) string { + var content string + if maps == nil { + content, _ = global.I18n.Localize(&i18n.LocalizeConfig{ + MessageID: key, + }) + } else { + content, _ = global.I18n.Localize(&i18n.LocalizeConfig{ + MessageID: key, + TemplateData: maps, + }) + } + content = strings.ReplaceAll(content, ": <no value>", "") + if content == "" { + return key + } else { + return content + } +} + +func GetMsgWithName(key string, name string, err error) string { + var ( + content string + dataMap = make(map[string]interface{}) + ) + dataMap["name"] = name + if err != nil { + dataMap["err"] = err.Error() + } + content, _ = global.I18n.Localize(&i18n.LocalizeConfig{ + MessageID: key, + TemplateData: dataMap, + }) + content = strings.ReplaceAll(content, "<no value>", "") + if content == "" { + return key + } else { + return content + } +} + +func GetErrMsg(key string, maps map[string]interface{}) string { + var content string + if maps == nil { + content, _ = global.I18n.Localize(&i18n.LocalizeConfig{ + MessageID: key, + }) + } else { + content, _ = global.I18n.Localize(&i18n.LocalizeConfig{ + MessageID: key, + TemplateData: maps, + }) + } + return content +} + +func GetMsgByKey(key string) string { + content, _ := global.I18n.Localize(&i18n.LocalizeConfig{ + MessageID: key, + }) + return content +} + +//go:embed lang/* +var fs embed.FS +var bundle *i18n.Bundle + +func UseI18n() gin.HandlerFunc { + return func(context *gin.Context) { + lang := context.GetHeader("Accept-Language") + if lang == "" { + lang = "zh" + } + global.I18n = i18n.NewLocalizer(bundle, lang) + } +} + +func Init() { + bundle = i18n.NewBundle(language.Chinese) + bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal) + _, _ = bundle.LoadMessageFileFS(fs, "lang/zh.yaml") + _, _ = bundle.LoadMessageFileFS(fs, "lang/en.yaml") + _, _ = bundle.LoadMessageFileFS(fs, "lang/zh-Hant.yaml") +} diff --git a/core/i18n/lang/en.yaml b/core/i18n/lang/en.yaml new file mode 100644 index 000000000..a3582c69f --- /dev/null +++ b/core/i18n/lang/en.yaml @@ -0,0 +1,198 @@ +ErrInvalidParams: "Request parameter error: {{ .detail }}" +ErrTokenParse: "Token generation error: {{ .detail }}" +ErrInitialPassword: "Initial password error" +ErrInternalServer: "Service internal error: {{ .detail }}" +ErrRecordExist: "Record already exists" +ErrRecordNotFound: "Records not found" +ErrStructTransform: "Type conversion failure: {{ .detail }}" +ErrNotLogin: "User is not Login: {{ .detail }}" +ErrPasswordExpired: "The current password has expired: {{ .detail }}" +ErrNotSupportType: "The system does not support the current type: {{ .detail }}" + +#common +ErrNameIsExist: "Name is already exist" +ErrDemoEnvironment: "Demo server, prohibit this operation!" +ErrCmdTimeout: "Command execution timed out!" +ErrCmdIllegal: "The command contains illegal characters. Please modify and try again!" +ErrPortExist: '{{ .port }} port is already occupied by {{ .type }} [{{ .name }}]' +TYPE_APP: "Application" +TYPE_RUNTIME: "Runtime environment" +TYPE_DOMAIN: "Domain name" +ErrTypePort: 'Port {{ .name }} format error' +ErrTypePortRange: 'Port range needs to be between 1-65535' +Success: "Success" +Failed: "Failed" +SystemRestart: "System restart causes task interruption" + +#app +ErrPortInUsed: "{{ .detail }} port already in use" +ErrAppLimit: "App exceeds install limit" +ErrAppRequired: "{{ .detail }} app is required" +ErrNotInstall: "App not installed" +ErrPortInOtherApp: "{{ .port }} port already in use by app {{ .apps }}" +ErrDbUserNotValid: "Stock database, username and password do not match!" +ErrDockerComposeNotValid: "docker-compose file format error!" +ErrUpdateBuWebsite: 'The application was updated successfully, but the modification of the website configuration file failed, please check the configuration!' +Err1PanelNetworkFailed: 'Default container network creation failed! {{ .detail }}' +ErrFileParse: 'Application docker-compose file parsing failed!' +ErrInstallDirNotFound: 'installation directory does not exist' +AppStoreIsUpToDate: 'The app store is already up to date!' +LocalAppVersionNull: 'The {{.name}} app is not synced to version! Could not add to application list' +LocalAppVersionErr: '{{.name}} failed to sync version {{.version}}! {{.err}}' +ErrFileNotFound: '{{.name}} file does not exist' +ErrFileParseApp: 'Failed to parse {{.name}} file {{.err}}' +ErrAppDirNull: 'version folder does not exist' +LocalAppErr: "App {{.name}} sync failed! {{.err}}" +ErrContainerName: "ContainerName is already exist" +ErrAppSystemRestart: "1Panel restart causes the task to terminate" +ErrCreateHttpClient: "Failed to create HTTP request {{.err}}" +ErrHttpReqTimeOut: "Request timed out {{.err}}" +ErrHttpReqFailed: "Request failed {{.err}}" +ErrHttpReqNotFound: "The file does not exist" +ErrNoSuchHost: "Network connection failed" +ErrImagePullTimeOut: 'Image pull timeout' +ErrContainerNotFound: '{{ .name }} container does not exist' +ErrContainerMsg: '{{ .name }} container is abnormal, please check the log on the container page for details' +ErrAppBackup: '{{ .name }} application backup failed err {{.err}}' +ErrImagePull: '{{ .name }} image pull failed err {{.err}}' +ErrVersionTooLow: 'The current 1Panel version is too low to update the app store, please upgrade the version' +ErrAppNameExist: 'App name is already exist' +AppStoreIsSyncing: 'The App Store is syncing, please try again later' +ErrGetCompose: "Failed to obtain docker-compose.yml file! {{ .detail }}" +ErrAppWarn: "Abnormal status, please check the log" +ErrAppParamKey: "Parameter {{ .name }} field exception" +ErrAppUpgrade: "Failed to upgrade application {{ .name }} {{ .err }}" +AppRecover: "App {{ .name }} rolled back " +PullImageStart: "Start pulling image {{ .name }}" +PullImageSuccess: "Image pulled successfully" +UpgradeAppStart: "Start upgrading application {{ .name }}" +UpgradeAppSuccess: "App {{ .name }} upgraded successfully" + +#file +ErrFileCanNotRead: "File can not read" +ErrFileToLarge: "file is too large" +ErrPathNotFound: "Path is not found" +ErrMovePathFailed: "The target path cannot contain the original path!" +ErrLinkPathNotFound: "Target path does not exist!" +ErrFileIsExist: "File or directory already exists!" +ErrFileUpload: "Failed to upload file {{.name}} {{.detail}}" +ErrFileDownloadDir: "Download folder not supported" +ErrCmdNotFound: "{{ .name}} command does not exist, please install this command on the host first" +ErrSourcePathNotFound: "Source directory does not exist" +ErrFavoriteExist: "This path has been collected" +ErrInvalidChar: "Illegal characters are prohibited" + +#website +ErrDomainIsExist: "Domain is already exist" +ErrAliasIsExist: "Alias is already exist" +ErrAppDelete: 'Other Website use this App' +ErrGroupIsUsed: 'The group is in use and cannot be deleted' +ErrBackupMatch: 'the backup file does not match the current partial data of the website: {{ .detail}}' +ErrBackupExist: 'the backup file corresponds to a portion of the original data that does not exist: {{ .detail}}' +ErrPHPResource: 'The local runtime does not support switching!' +ErrPathPermission: 'A folder with non-1000:1000 permissions was detected in the index directory, which may cause an Access denied error when accessing the website. Please click the save button above' +ErrDomainIsUsed: "Domain is already used by website {{ .name }}" +ErrDomainFormat: "{{ .name }} domain format error" +ErrDefaultAlias: "default is a reserved code name, please use another code name" + +#ssl +ErrSSLCannotDelete: "The certificate {{ .name }} is being used by the website and cannot be removed" +ErrAccountCannotDelete: "The certificate associated with the account cannot be deleted" +ErrSSLApply: "The certificate continues to be signed successfully, but openresty reload fails, please check the configuration!" +ErrEmailIsExist: 'Email is already exist' +ErrSSLKeyNotFound: 'The private key file does not exist' +ErrSSLCertificateNotFound: 'The certificate file does not exist' +ErrSSLKeyFormat: 'Private key file verification error' +ErrSSLCertificateFormat: 'Certificate file format error, please use pem format' +ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid or EabHmacKey cannot be empty' +ErrOpenrestyNotFound: 'Http mode requires Openresty to be installed first' +ApplySSLStart: 'Start applying for certificate, domain name [{{ .domain }}] application method [{{ .type }}] ' +dnsAccount: "DNS Automatic" +dnsManual: "DNS Manual" +http: "HTTP" +ApplySSLFailed: 'Application for [{{ .domain }}] certificate failed, {{.detail}} ' +ApplySSLSuccess: 'Application for [{{ .domain }}] certificate successful! ! ' +DNSAccountName: 'DNS account [{{ .name }}] manufacturer [{{.type}}]' +PushDirLog: 'Certificate pushed to directory [{{ .path }}] {{ .status }}' +ErrDeleteCAWithSSL: "There is an issued certificate under the current organization and cannot be deleted" +ErrDeleteWithPanelSSL: "Panel SSL configuration uses this certificate and cannot be deleted" +ErrDefaultCA: "The default organization cannot be deleted" +ApplyWebSiteSSLLog: "Start updating {{ .name }} website certificate" +ErrUpdateWebsiteSSL: "{{ .name }} website failed to update certificate: {{ .err }}" +ApplyWebSiteSSLSuccess: "Update website certificate successfully" + +#mysql +ErrUserIsExist: "The current user already exists. Please enter a new user" +ErrDatabaseIsExist: "The current database already exists. Please enter a new database" +ErrExecTimeOut: "SQL execution timed out, please check the database" +ErrRemoteExist: "The remote database already exists with that name, please modify it and try again" +ErrLocalExist: "The local database already exists with that name, please modify it and try again" + +#redis +ErrTypeOfRedis: "The recovery file type does not match the current persistence mode. Modify the file type and try again" + +#container +ErrInUsed: "{{ .detail }} is in use and cannot be deleted" +ErrObjectInUsed: "This object is in use and cannot be deleted" +ErrPortRules: "The number of ports does not match, please re-enter!" +ErrPgImagePull: "Image pull timeout. Please configure image acceleration or manually pull the postgres:16.0-alpine image and try again" + +#runtime +ErrDirNotFound: "The build folder does not exist! Please check file integrity!" +ErrFileNotExist: "{{ .detail }} file does not exist! Please check source file integrity!" +ErrImageBuildErr: "Image build failed" +ErrImageExist: "Image is already exist!" +ErrDelWithWebsite: "The operating environment has been associated with a website and cannot be deleted" +ErrRuntimeStart: "Failed to start" +ErrPackageJsonNotFound: "package.json file does not exist" +ErrScriptsNotFound: "No scripts configuration item was found in package.json" +ErrContainerNameNotFound: "Unable to get container name, please check .env file" +ErrNodeModulesNotFound: "The node_modules folder does not exist! Please edit the running environment or wait for the running environment to start successfully" + +#setting +ErrBackupInUsed: "The backup account is already being used in a cronjob and cannot be deleted." +ErrBackupCheck: "Backup account test connection failed {{ .err}}" +ErrOSSConn: "Unable to retrieve the latest version, please check if the server can connect to the external network." +ErrEntrance: "Security entrance information error. Please check and try again!" + +#tool +ErrConfigNotFound: "Configuration file does not exist" +ErrConfigParse: "Configuration file format error" +ErrConfigIsNull: "The configuration file is not allowed to be empty" +ErrConfigDirNotFound: "The running directory does not exist" +ErrConfigAlreadyExist: "A configuration file with the same name already exists" +ErrUserFindErr: "Failed to find user {{ .name }} {{ .err }}" + +#ssh +ErrFirewall: "No firewalld or ufw service is detected. Please check and try again!" + +#cronjob +ErrBashExecute: "Script execution error, please check the specific information in the task output text area." +ErrCutWebsiteLog: "{{ .name }} website log cutting failed, error {{ .err }}" +CutWebsiteLogSuccess: "{{ .name }} website log cut successfully, backup path {{ .path }}" + +#toolbox +ErrNotExistUser: "The current user does not exist. Please modify and retry!" +ErrBanAction: "Setting failed, the current {{ .name }} service is unavailable, please check and try again!" +ErrClamdscanNotFound: "The clamdscan command was not detected, please refer to the documentation to install it!" + +#waf +ErrScope: "Modification of this configuration is not supported" +ErrStateChange: "State modification failed" +ErrRuleExist: "Rule is Exist" +ErrRuleNotExist: "Rule is not Exist" +ErrParseIP: "IP format error" +ErrDefaultIP: "default is a reserved name, please change it to another name" +ErrGroupInUse: "The IP group is used by the black/white list and cannot be deleted" +ErrGroupExist: "IP group name already exists" +ErrIPRange: "Wrong IP range" +ErrIPExist: "IP is exit" + +#license +ErrLicense: "License format error, please check and try again!" +ErrLicenseCheck: "License verification failed, please check and try again!" +ErrLicenseSave: "Failed to save license information, error {{ .err }}, please try again!" +ErrLicenseSync: "Failed to sync license information, no license information detected in the database!" +ErrXpackNotFound: "This section is a professional edition feature, please import the license first in Panel Settings-License interface" +ErrXpackNotActive: "This section is a professional edition feature, please synchronize the license status first in Panel Settings-License interface" +ErrXpackOutOfDate: "The current license has expired, please re-import the license in Panel Settings-License interface" diff --git a/core/i18n/lang/zh-Hant.yaml b/core/i18n/lang/zh-Hant.yaml new file mode 100644 index 000000000..56a8e2227 --- /dev/null +++ b/core/i18n/lang/zh-Hant.yaml @@ -0,0 +1,200 @@ +ErrInvalidParams: "請求參數錯誤: {{ .detail }}" +ErrTokenParse: "Token 產生錯誤: {{ .detail }}" +ErrInitialPassword: "原密碼錯誤" +ErrInternalServer: "伺服器內部錯誤: {{ .detail }}" +ErrRecordExist: "記錄已存在" +ErrRecordNotFound: "記錄未找到" +ErrStructTransform: "類型轉換失敗: {{ .detail }}" +ErrNotLogin: "用戶未登入: {{ .detail }}" +ErrPasswordExpired: "當前密碼已過期: {{ .detail }}" +ErrNotSupportType: "系統暫不支持當前類型: {{ .detail }}" + +#common +ErrNameIsExist: "名稱已存在" +ErrDemoEnvironment: "演示伺服器,禁止此操作!" +ErrCmdTimeout: "指令執行超時!" +ErrCmdIllegal: "執行命令中存在不合法字符,請修改後重試!" +ErrPortExist: '{{ .port }} 埠已被 {{ .type }} [{{ .name }}] 佔用' +TYPE_APP: "應用" +TYPE_RUNTIME: "運作環境" +TYPE_DOMAIN: "網域名稱" +ErrTypePort: '埠 {{ .name }} 格式錯誤' +ErrTypePortRange: '連接埠範圍需要在 1-65535 之間' +Success: "成功" +Failed: "失敗" +SystemRestart: "系統重啟導致任務中斷" +ErrInvalidChar: "禁止使用非法字元" + +#app +ErrPortInUsed: "{{ .detail }} 端口已被佔用!" +ErrAppLimit: "應用超出安裝數量限制" +ErrAppRequired: "請先安裝 {{ .detail }} 應用" +ErrNotInstall: "應用未安裝" +ErrPortInOtherApp: "{{ .port }} 端口已被應用 {{ .apps }} 佔用!" +ErrDbUserNotValid: "儲存資料庫,用戶名密碼不匹配!" +ErrDockerComposeNotValid: "docker-compose 文件格式錯誤" +ErrUpdateBuWebsite: '應用更新成功,但是網站配置文件修改失敗,請檢查配置!' +Err1PanelNetworkFailed: '默認容器網絡創建失敗!{{ .detail }}' +ErrFileParse: '應用 docker-compose 文件解析失敗!' +ErrInstallDirNotFound: '安裝目錄不存在' +AppStoreIsUpToDate: '應用商店已經是最新版本' +LocalAppVersionNull: '{{.name}} 應用未同步到版本!無法添加到應用列表' +LocalAppVersionErr: '{{.name}} 同步版本 {{.version}} 失敗!{{.err}}' +ErrFileNotFound: '{{.name}} 文件不存在' +ErrFileParseApp: '{{.name}} 文件解析失敗 {{.err}}' +ErrAppDirNull: '版本資料夾不存在' +LocalAppErr: "應用 {{.name}} 同步失敗!{{.err}}" +ErrContainerName: "容器名稱已存在" +ErrAppSystemRestart: "1Panel 重啟導致任務中斷" +ErrCreateHttpClient: "創建HTTP請求失敗 {{.err}}" +ErrHttpReqTimeOut: "請求超時 {{.err}}" +ErrHttpReqFailed: "請求失敗 {{.err}}" +ErrHttpReqNotFound: "文件不存在" +ErrNoSuchHost: "網路連接失敗" +ErrImagePullTimeOut: "鏡像拉取超時" +ErrContainerNotFound: '{{ .name }} 容器不存在' +ErrContainerMsg: '{{ .name }} 容器異常,具體請在容器頁面查看日誌' +ErrAppBackup: '{{ .name }} 應用備份失敗 err {{.err}}' +ErrImagePull: '{{ .name }} 鏡像拉取失敗 err {{.err}}' +ErrVersionTooLow: '當前 1Panel 版本過低,無法更新應用商店,請升級版本之後操作' +ErrAppNameExist: '應用名稱已存在' +AppStoreIsSyncing: '應用程式商店正在同步中,請稍後再試' +ErrGetCompose: "docker-compose.yml 檔案取得失敗!{{ .detail }}" +ErrAppWarn: "狀態異常,請查看日誌" +ErrAppParamKey: "參數 {{ .name }} 欄位異常" +ErrAppUpgrade: "應用程式 {{ .name }} 升級失敗 {{ .err }}" +AppRecover: "應用程式 {{ .name }} 回滾 " +PullImageStart: "開始拉取鏡像 {{ .name }}" +PullImageSuccess: "鏡像拉取成功" +UpgradeAppStart: "開始升級應用程式 {{ .name }}" +UpgradeAppSuccess: "應用程式 {{ .name }} 升級成功" + +#file +ErrFileCanNotRead: "此文件不支持預覽" +ErrFileToLarge: "文件超過10M,無法打開" +ErrPathNotFound: "目錄不存在" +ErrMovePathFailed: "目標路徑不能包含原路徑!" +ErrLinkPathNotFound: "目標路徑不存在!" +ErrFileIsExist: "文件或文件夾已存在!" +ErrFileUpload: "{{ .name }} 上傳文件失敗 {{ .detail}}" +ErrFileDownloadDir: "不支持下載文件夾" +ErrCmdNotFound: "{{ .name}} 命令不存在,請先在宿主機安裝此命令" +ErrSourcePathNotFound: "源目錄不存在" +ErrFavoriteExist: "已收藏此路徑" + +#website +ErrDomainIsExist: "域名已存在" +ErrAliasIsExist: "代號已存在" +ErrAppDelete: '其他網站使用此應用,無法刪除' +ErrGroupIsUsed: '分組正在使用中,無法刪除' +ErrBackupMatch: '該備份文件與當前網站部分數據不匹配: {{ .detail}}' +ErrBackupExist: '該備份文件對應部分原數據不存在: {{ .detail}}' +ErrPHPResource: '本地運行環境不支持切換!' +ErrPathPermission: 'index 目錄下偵測到非 1000:1000 權限資料夾,可能導致網站存取 Access denied 錯誤,請點擊上方儲存按鈕' +ErrDomainIsUsed: "域名已被網站【{{ .name }}】使用" +ErrDomainFormat: "{{ .name }} 域名格式不正確" +ErrDefaultAlias: "default 為保留代號,請使用其他代號" + +#ssl +ErrSSLCannotDelete: "{{ .name }} 證書正在被網站使用,無法刪除" +ErrAccountCannotDelete: "帳號關聯證書,無法刪除" +ErrSSLApply: "證書續簽成功,openresty reload失敗,請檢查配置!" +ErrEmailIsExist: '郵箱已存在' +ErrSSLKeyNotFound: '私鑰文件不存在' +ErrSSLCertificateNotFound: '證書文件不存在' +ErrSSLKeyFormat: '私鑰文件校驗錯誤' +ErrSSLCertificateFormat: '證書文件格式錯誤,請使用 pem 格式' +ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid 或 EabHmacKey 不能為空' +ErrOpenrestyNotFound: 'Http 模式需要先安裝 Openresty' +ApplySSLStart: '開始申請憑證,網域 [{{ .domain }}] 申請方式 [{{ .type }}] ' +dnsAccount: "DNS 自動" +dnsManual: "DNS 手排" +http: "HTTP" +ApplySSLFailed: '申請 [{{ .domain }}] 憑證失敗, {{.detail}} ' +ApplySSLSuccess: '申請 [{{ .domain }}] 憑證成功! ! ' +DNSAccountName: 'DNS 帳號 [{{ .name }}] 廠商 [{{.type}}]' +PushDirLog: '憑證推送到目錄 [{{ .path }}] {{ .status }}' +ErrDeleteCAWithSSL: "目前機構下存在已簽發證書,無法刪除" +ErrDeleteWithPanelSSL: "面板 SSL 配置使用此證書,無法刪除" +ErrDefaultCA: "默認機構不能刪除" +ApplyWebSiteSSLLog: "開始更新 {{ .name }} 網站憑證" +ErrUpdateWebsiteSSL: "{{ .name }} 網站更新憑證失敗: {{ .err }}" +ApplyWebSiteSSLSuccess: "更新網站憑證成功" + + +#mysql +ErrUserIsExist: "當前用戶已存在,請重新輸入" +ErrDatabaseIsExist: "當前資料庫已存在,請重新輸入" +ErrExecTimeOut: "SQL 執行超時,請檢查數據庫" +ErrRemoteExist: "遠程數據庫已存在該名稱,請修改後重試" +ErrLocalExist: "本地數據庫已存在該名稱,請修改後重試" + +#redis +ErrTypeOfRedis: "恢復文件類型與當前持久化方式不符,請修改後重試" + +#container +ErrInUsed: "{{ .detail }} 正被使用,無法刪除" +ErrObjectInUsed: "該對象正被使用,無法刪除" +ErrPortRules: "端口數目不匹配,請重新輸入!" +ErrPgImagePull: "鏡像拉取超時,請配置鏡像加速或手動拉取 postgres:16.0-alpine 鏡像後重試" + +#runtime +ErrDirNotFound: "build 文件夾不存在!請檢查文件完整性!" +ErrFileNotExist: "{{ .detail }} 文件不存在!請檢查源文件完整性!" +ErrImageBuildErr: "鏡像 build 失敗" +ErrImageExist: "鏡像已存在!" +ErrDelWithWebsite: "運行環境已經關聯網站,無法刪除" +ErrRuntimeStart: "啟動失敗" +ErrPackageJsonNotFound: "package.json 文件不存在" +ErrScriptsNotFound: "沒有在 package.json 中找到 scripts 配置項" +ErrContainerNameNotFound: "無法取得容器名稱,請檢查 .env 文件" +ErrNodeModulesNotFound: "node_modules 文件夾不存在!請編輯運行環境或者等待運行環境啟動成功" + +#setting +ErrBackupInUsed: "該備份帳號已在計劃任務中使用,無法刪除" +ErrBackupCheck: "備份帳號測試連接失敗 {{ .err}}" +ErrOSSConn: "無法獲取最新版本,請確認伺服器是否能夠連接外部網路。" +ErrEntrance: "安全入口信息錯誤,請檢查後重試!" + +#tool +ErrConfigNotFound: "配置文件不存在" +ErrConfigParse: "配置文件格式有誤" +ErrConfigIsNull: "配置文件不允許為空" +ErrConfigDirNotFound: "運行目錄不存在" +ErrConfigAlreadyExist: "已存在同名配置文件" +ErrUserFindErr: "用戶 {{ .name }} 查找失敗 {{ .err }}" + +#ssh +ErrFirewall: "當前未檢測到系統 firewalld 或 ufw 服務,請檢查後重試!" + +#cronjob +ErrBashExecute: "腳本執行錯誤,請在任務輸出文本域中查看具體信息。" +ErrCutWebsiteLog: "{{ .name }} 網站日誌切割失敗,錯誤 {{ .err }}" +CutWebsiteLogSuccess: "{{ .name }} 網站日誌切割成功,備份路徑 {{ .path }}" + +#toolbox +ErrNotExistUser: "當前使用者不存在,請修改後重試!" +ErrBanAction: "設置失敗,當前 {{ .name }} 服務不可用,請檢查後重試!" +ErrClamdscanNotFound: "未偵測到 clamdscan 指令,請參考文件安裝!" + +#waf +ErrScope: "不支援修改此配置" +ErrStateChange: "狀態修改失敗" +ErrRuleExist: "規則已存在" +ErrRuleNotExist: "規則不存在" +ErrParseIP: "IP 格式錯誤" +ErrDefaultIP: "default 為保留名稱,請更換其他名稱" +ErrGroupInUse: "IP 群組被黑/白名單使用,無法刪除" +ErrGroupExist: "IP 群組名稱已存在" +ErrIPRange: "IP 範圍錯誤" +ErrIPExist: "IP 已存在" + + +#license +ErrLicense: "許可證格式錯誤,請檢查後重試!" +ErrLicenseCheck: "許可證校驗失敗,請檢查後重試!" +ErrLicenseSave: "許可證信息保存失敗,錯誤 {{ .err }}, 請重試!" +ErrLicenseSync: "許可證信息同步失敗,資料庫中未檢測到許可證信息!" +ErrXpackNotFound: "該部分為專業版功能,請先在 面板設置-許可證 界面導入許可證" +ErrXpackNotActive: "該部分為專業版功能,請先在 面板設置-許可證 界面同步許可證狀態" +ErrXpackOutOfDate: "當前許可證已過期,請重新在 面板設置-許可證 界面導入許可證" diff --git a/core/i18n/lang/zh.yaml b/core/i18n/lang/zh.yaml new file mode 100644 index 000000000..eca156380 --- /dev/null +++ b/core/i18n/lang/zh.yaml @@ -0,0 +1,202 @@ +ErrInvalidParams: "请求参数错误: {{ .detail }}" +ErrTokenParse: "Token 生成错误: {{ .detail }}" +ErrInitialPassword: "原密码错误" +ErrInternalServer: "服务内部错误: {{ .detail }}" +ErrRecordExist: "记录已存在" +ErrRecordNotFound: "记录未能找到" +ErrStructTransform: "类型转换失败: {{ .detail }}" +ErrNotLogin: "用户未登录: {{ .detail }}" +ErrPasswordExpired: "当前密码已过期: {{ .detail }}" +ErrNotSupportType: "系统暂不支持当前类型: {{ .detail }}" + +#common +ErrNameIsExist: "名称已存在" +ErrDemoEnvironment: "演示服务器,禁止此操作!" +ErrCmdTimeout: "命令执行超时!" +ErrCmdIllegal: "执行命令中存在不合法字符,请修改后重试!" +ErrPortExist: '{{ .port }} 端口已被 {{ .type }} [{{ .name }}] 占用' +TYPE_APP: "应用" +TYPE_RUNTIME: "运行环境" +TYPE_DOMAIN: "域名" +ErrTypePort: '端口 {{ .name }} 格式错误' +ErrTypePortRange: '端口范围需要在 1-65535 之间' +Success: "成功" +Failed: "失败" +SystemRestart: "系统重启导致任务中断" + +#app +ErrPortInUsed: "{{ .detail }} 端口已被占用!" +ErrAppLimit: "应用超出安装数量限制" +ErrAppRequired: "请先安装 {{ .detail }} 应用" +ErrNotInstall: "应用未安装" +ErrPortInOtherApp: "{{ .port }} 端口已被应用 {{ .apps }} 占用!" +ErrDbUserNotValid: "存量数据库,用户名密码不匹配!" +ErrDockerComposeNotValid: "docker-compose 文件格式错误" +ErrUpdateBuWebsite: '应用更新成功,但是网站配置文件修改失败,请检查配置!' +Err1PanelNetworkFailed: '默认容器网络创建失败!{{ .detail }}' +ErrFileParse: '应用 docker-compose 文件解析失败!' +ErrInstallDirNotFound: '安装目录不存在' +AppStoreIsUpToDate: '应用商店已经是最新版本' +LocalAppVersionNull: '{{.name}} 应用未同步到版本!无法添加到应用列表' +LocalAppVersionErr: '{{.name}} 同步版本 {{.version}} 失败!{{.err}}' +ErrFileNotFound: '{{.name}} 文件不存在' +ErrFileParseApp: '{{.name}} 文件解析失败 {{.err}}' +ErrAppDirNull: '版本文件夹不存在' +LocalAppErr: "应用 {{.name}} 同步失败!{{.err}}" +ErrContainerName: "容器名称已存在" +ErrAppSystemRestart: "1Panel 重启导致任务终止" +ErrCreateHttpClient: "创建HTTP请求失败 {{.err}}" +ErrHttpReqTimeOut: "请求超时 {{.err}}" +ErrHttpReqFailed: "请求失败 {{.err}}" +ErrHttpReqNotFound: "文件不存在" +ErrNoSuchHost: "网络连接失败" +ErrImagePullTimeOut: '镜像拉取超时' +ErrContainerNotFound: '{{ .name }} 容器不存在' +ErrContainerMsg: '{{ .name }} 容器异常,具体请在容器页面查看日志' +ErrAppBackup: '{{ .name }} 应用备份失败 err {{.err}}' +ErrImagePull: '镜像拉取失败 {{.err}}' +ErrVersionTooLow: '当前 1Panel 版本过低,无法更新应用商店,请升级版本之后操作' +ErrAppNameExist: '应用名称已存在' +AppStoreIsSyncing: '应用商店正在同步中,请稍后再试' +ErrGetCompose: "docker-compose.yml 文件获取失败!{{ .detail }}" +ErrAppWarn: "状态异常,请查看日志" +ErrAppParamKey: "参数 {{ .name }} 字段异常" +ErrAppUpgrade: "应用 {{ .name }} 升级失败 {{ .err }}" +AppRecover: "应用 {{ .name }} 回滚 " +PullImageStart: "开始拉取镜像 {{ .name }}" +PullImageSuccess: "镜像拉取成功" +UpgradeAppStart: "开始升级应用 {{ .name }}" +UpgradeAppSuccess: "应用 {{ .name }} 升级成功" + +#file +ErrFileCanNotRead: "此文件不支持预览" +ErrFileToLarge: "文件超过10M,无法打开" +ErrPathNotFound: "目录不存在" +ErrMovePathFailed: "目标路径不能包含原路径!" +ErrLinkPathNotFound: "目标路径不存在!" +ErrFileIsExist: "文件或文件夹已存在!" +ErrFileUpload: "{{ .name }} 上传文件失败 {{ .detail}}" +ErrFileDownloadDir: "不支持下载文件夹" +ErrCmdNotFound: "{{ .name}} 命令不存在,请先在宿主机安装此命令" +ErrSourcePathNotFound: "源目录不存在" +ErrFavoriteExist: "已收藏此路径" +ErrInvalidChar: "禁止使用非法字符" + +#website +ErrDomainIsExist: "域名已存在" +ErrAliasIsExist: "代号已存在" +ErrAppDelete: '其他网站使用此应用,无法删除' +ErrGroupIsUsed: '分组正在使用中,无法删除' +ErrBackupMatch: '该备份文件与当前网站部分数据不匹配 {{ .detail}}' +ErrBackupExist: '该备份文件对应部分源数据不存在 {{ .detail}}' +ErrPHPResource: '本地运行环境不支持切换!' +ErrPathPermission: 'index 目录下检测到非 1000:1000 权限文件夹,可能导致网站访问 Access denied 错误,请点击上方保存按钮' +ErrDomainIsUsed: "域名已被网站【{{ .name }}】使用" +ErrDomainFormat: "{{ .name }} 域名格式不正确" +ErrDefaultAlias: "default 为保留代号,请使用其他代号" + +#ssl +ErrSSLCannotDelete: "{{ .name }} 证书正在被网站使用,无法删除" +ErrAccountCannotDelete: "账号关联证书,无法删除" +ErrSSLApply: "证书续签成功,openresty reload失败,请检查配置!" +ErrEmailIsExist: '邮箱已存在' +ErrSSLKeyNotFound: '私钥文件不存在' +ErrSSLCertificateNotFound: '证书文件不存在' +ErrSSLKeyFormat: '私钥文件校验失败' +ErrSSLCertificateFormat: '证书文件格式错误,请使用 pem 格式' +ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid 或 EabHmacKey 不能为空' +ErrOpenrestyNotFound: 'Http 模式需要首先安装 Openresty' +ApplySSLStart: '开始申请证书,域名 [{{ .domain }}] 申请方式 [{{ .type }}] ' +dnsAccount: "DNS 自动" +dnsManual: "DNS 手动" +http: "HTTP" +ApplySSLFailed: '申请 [{{ .domain }}] 证书失败, {{.detail}} ' +ApplySSLSuccess: '申请 [{{ .domain }}] 证书成功!!' +DNSAccountName: 'DNS 账号 [{{ .name }}] 厂商 [{{.type}}]' +PushDirLog: '证书推送到目录 [{{ .path }}] {{ .status }}' +ErrDeleteCAWithSSL: "当前机构下存在已签发证书,无法删除" +ErrDeleteWithPanelSSL: "面板 SSL 配置使用此证书,无法删除" +ErrDefaultCA: "默认机构不能删除" +ApplyWebSiteSSLLog: "开始更新 {{ .name }} 网站证书" +ErrUpdateWebsiteSSL: "{{ .name }} 网站更新证书失败: {{ .err }}" +ApplyWebSiteSSLSuccess: "更新网站证书成功" +ErrExecShell: "执行脚本失败 {{ .err }}" +ExecShellStart: "开始执行脚本" +ExecShellSuccess: "脚本执行成功" + +#mysql +ErrUserIsExist: "当前用户已存在,请重新输入" +ErrDatabaseIsExist: "当前数据库已存在,请重新输入" +ErrExecTimeOut: "SQL 执行超时,请检查数据库" +ErrRemoteExist: "远程数据库已存在该名称,请修改后重试" +ErrLocalExist: "本地数据库已存在该名称,请修改后重试" + +#redis +ErrTypeOfRedis: "恢复文件类型与当前持久化方式不符,请修改后重试" + +#container +ErrInUsed: "{{ .detail }} 正被使用,无法删除" +ErrObjectInUsed: "该对象正被使用,无法删除" +ErrPortRules: "端口数目不匹配,请重新输入!" +ErrPgImagePull: "镜像拉取超时,请配置镜像加速或手动拉取 postgres:16.0-alpine 镜像后重试" + +#runtime +ErrDirNotFound: "build 文件夹不存在!请检查文件完整性!" +ErrFileNotExist: "{{ .detail }} 文件不存在!请检查源文件完整性!" +ErrImageBuildErr: "镜像 build 失败" +ErrImageExist: "镜像已存在!" +ErrDelWithWebsite: "运行环境已经关联网站,无法删除" +ErrRuntimeStart: "启动失败" +ErrPackageJsonNotFound: "package.json 文件不存在" +ErrScriptsNotFound: "没有在 package.json 中找到 scripts 配置项" +ErrContainerNameNotFound: "无法获取容器名称,请检查 .env 文件" +ErrNodeModulesNotFound: "node_modules 文件夹不存在!请编辑运行环境或者等待运行环境启动成功" + +#setting +ErrBackupInUsed: "该备份账号已在计划任务中使用,无法删除" +ErrBackupCheck: "备份账号测试连接失败 {{ .err}}" +ErrOSSConn: "无法获取最新版本,请确认服务器是否能够连接外部网络。" +ErrEntrance: "安全入口信息错误,请检查后重试!" + +#tool +ErrConfigNotFound: "配置文件不存在" +ErrConfigParse: "配置文件格式有误" +ErrConfigIsNull: "配置文件不允许为空" +ErrConfigDirNotFound: "运行目录不存在" +ErrConfigAlreadyExist: "已存在同名配置文件" +ErrUserFindErr: "用户 {{ .name }} 查找失败 {{ .err }}" + +#ssh +ErrFirewall: "当前未检测到系统 firewalld 或 ufw 服务,请检查后重试!" + +#cronjob +ErrBashExecute: "脚本执行错误,请在任务输出文本域中查看具体信息。" +ErrCutWebsiteLog: "{{ .name }} 网站日志切割失败,错误 {{ .err }}" +CutWebsiteLogSuccess: "{{ .name }} 网站日志切割成功,备份路径 {{ .path }}" + +#toolbox +ErrNotExistUser: "当前用户不存在,请修改后重试!" +ErrBanAction: "设置失败,当前 {{ .name }} 服务不可用,请检查后重试!" +ErrClamdscanNotFound: "未检测到 clamdscan 命令,请参考文档安装!" + +#waf +ErrScope: "不支持修改此配置" +ErrStateChange: "状态修改失败" +ErrRuleExist: "规则已存在" +ErrRuleNotExist: "规则不存在" +ErrParseIP: "IP 格式错误" +ErrDefaultIP: "default 为保留名称,请更换其他名称" +ErrGroupInUse: "IP 组被黑/白名单使用,无法删除" +ErrGroupExist: "IP 组名称已存在" +ErrIPRange: "IP 范围错误" +ErrIPExist: "IP 已存在" + +#license +ErrLicense: "许可证格式错误,请检查后重试!" +ErrLicenseCheck: "许可证校验失败,请检查后重试!" +ErrLicenseSave: "许可证信息保存失败,错误 {{ .err }},请重试!" +ErrLicenseSync: "许可证信息同步失败,数据库中未检测到许可证信息!" +ErrXpackNotFound: "该部分为专业版功能,请先在 面板设置-许可证 界面导入许可证" +ErrXpackNotActive: "该部分为专业版功能,请先在 面板设置-许可证 界面同步许可证状态" +ErrXpackOutOfDate: "当前许可证已过期,请重新在 面板设置-许可证 界面导入许可证" + diff --git a/core/init/cache/badger_db/badger_db.go b/core/init/cache/badger_db/badger_db.go new file mode 100644 index 000000000..a1508503a --- /dev/null +++ b/core/init/cache/badger_db/badger_db.go @@ -0,0 +1,79 @@ +package badger_db + +import ( + "fmt" + "time" + + "github.com/dgraph-io/badger/v4" +) + +type Cache struct { + db *badger.DB +} + +func NewCacheDB(db *badger.DB) *Cache { + return &Cache{ + db: db, + } +} + +func (c *Cache) Set(key string, value interface{}) error { + err := c.db.Update(func(txn *badger.Txn) error { + v := []byte(fmt.Sprintf("%v", value)) + return txn.Set([]byte(key), v) + }) + return err +} + +func (c *Cache) Del(key string) error { + err := c.db.Update(func(txn *badger.Txn) error { + return txn.Delete([]byte(key)) + }) + return err +} + +func (c *Cache) Clean() error { + return c.db.DropAll() +} + +func (c *Cache) Get(key string) ([]byte, error) { + var result []byte + err := c.db.View(func(txn *badger.Txn) error { + item, err := txn.Get([]byte(key)) + if err != nil { + return err + } + err = item.Value(func(val []byte) error { + result = append([]byte{}, val...) + return nil + }) + return err + }) + return result, err +} + +func (c *Cache) SetWithTTL(key string, value interface{}, duration time.Duration) error { + err := c.db.Update(func(txn *badger.Txn) error { + v := []byte(fmt.Sprintf("%v", value)) + e := badger.NewEntry([]byte(key), v).WithTTL(duration) + return txn.SetEntry(e) + }) + return err +} + +func (c *Cache) PrefixScanKey(prefixStr string) ([]string, error) { + var res []string + err := c.db.View(func(txn *badger.Txn) error { + it := txn.NewIterator(badger.DefaultIteratorOptions) + defer it.Close() + prefix := []byte(prefixStr) + for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { + item := it.Item() + k := item.Key() + res = append(res, string(k)) + return nil + } + return nil + }) + return res, err +} diff --git a/core/init/cache/cache.go b/core/init/cache/cache.go new file mode 100644 index 000000000..2d9f1ade2 --- /dev/null +++ b/core/init/cache/cache.go @@ -0,0 +1,56 @@ +package cache + +import ( + "time" + + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/init/cache/badger_db" + "github.com/dgraph-io/badger/v4" +) + +func Init() { + c := global.CONF.System.Cache + + options := badger.Options{ + Dir: c, + ValueDir: c, + ValueLogFileSize: 64 << 20, + ValueLogMaxEntries: 10 << 20, + VLogPercentile: 0.1, + + MemTableSize: 32 << 20, + BaseTableSize: 2 << 20, + BaseLevelSize: 10 << 20, + TableSizeMultiplier: 2, + LevelSizeMultiplier: 10, + MaxLevels: 7, + NumGoroutines: 4, + MetricsEnabled: true, + NumCompactors: 2, + NumLevelZeroTables: 5, + NumLevelZeroTablesStall: 15, + NumMemtables: 1, + BloomFalsePositive: 0.01, + BlockSize: 2 * 1024, + SyncWrites: false, + NumVersionsToKeep: 1, + CompactL0OnClose: false, + VerifyValueChecksum: false, + BlockCacheSize: 32 << 20, + IndexCacheSize: 0, + ZSTDCompressionLevel: 1, + EncryptionKey: []byte{}, + EncryptionKeyRotationDuration: 10 * 24 * time.Hour, // Default 10 days. + DetectConflicts: true, + NamespaceOffset: -1, + } + + cache, err := badger.Open(options) + if err != nil { + panic(err) + } + _ = cache.DropAll() + global.CacheDb = cache + global.CACHE = badger_db.NewCacheDB(cache) + global.LOG.Info("init cache successfully") +} diff --git a/core/init/db/db.go b/core/init/db/db.go new file mode 100644 index 000000000..c8aaf9f0e --- /dev/null +++ b/core/init/db/db.go @@ -0,0 +1,58 @@ +package db + +import ( + "fmt" + "log" + "os" + "time" + + "github.com/1Panel-dev/1Panel/core/global" + "github.com/glebarez/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +func Init() { + if _, err := os.Stat(global.CONF.System.DbPath); err != nil { + if err := os.MkdirAll(global.CONF.System.DbPath, os.ModePerm); err != nil { + panic(fmt.Errorf("init db dir failed, err: %v", err)) + } + } + fullPath := global.CONF.System.DbPath + "/" + global.CONF.System.DbFile + if _, err := os.Stat(fullPath); err != nil { + f, err := os.Create(fullPath) + if err != nil { + panic(fmt.Errorf("init db file failed, err: %v", err)) + } + _ = f.Close() + } + + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), + logger.Config{ + SlowThreshold: time.Second, + LogLevel: logger.Silent, + IgnoreRecordNotFoundError: true, + Colorful: false, + }, + ) + + db, err := gorm.Open(sqlite.Open(fullPath), &gorm.Config{ + DisableForeignKeyConstraintWhenMigrating: true, + Logger: newLogger, + }) + if err != nil { + panic(err) + } + _ = db.Exec("PRAGMA journal_mode = WAL;") + sqlDB, dbError := db.DB() + if dbError != nil { + panic(dbError) + } + sqlDB.SetConnMaxIdleTime(10) + sqlDB.SetMaxOpenConns(100) + sqlDB.SetConnMaxLifetime(time.Hour) + + global.DB = db + global.LOG.Info("init db successfully") +} diff --git a/core/init/hook/hook.go b/core/init/hook/hook.go new file mode 100644 index 000000000..23c778782 --- /dev/null +++ b/core/init/hook/hook.go @@ -0,0 +1,82 @@ +package hook + +import ( + "strings" + + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/1Panel-dev/1Panel/core/utils/common" + "github.com/1Panel-dev/1Panel/core/utils/encrypt" +) + +func Init() { + settingRepo := repo.NewISettingRepo() + portSetting, err := settingRepo.Get(settingRepo.WithByKey("ServerPort")) + if err != nil { + global.LOG.Errorf("load service port from setting failed, err: %v", err) + } + global.CONF.System.Port = portSetting.Value + ipv6Setting, err := settingRepo.Get(settingRepo.WithByKey("Ipv6")) + if err != nil { + global.LOG.Errorf("load ipv6 status from setting failed, err: %v", err) + } + global.CONF.System.Ipv6 = ipv6Setting.Value + bindAddressSetting, err := settingRepo.Get(settingRepo.WithByKey("BindAddress")) + if err != nil { + global.LOG.Errorf("load bind address from setting failed, err: %v", err) + } + global.CONF.System.BindAddress = bindAddressSetting.Value + sslSetting, err := settingRepo.Get(settingRepo.WithByKey("SSL")) + if err != nil { + global.LOG.Errorf("load service ssl from setting failed, err: %v", err) + } + global.CONF.System.SSL = sslSetting.Value + + if _, err := settingRepo.Get(settingRepo.WithByKey("SystemStatus")); err != nil { + _ = settingRepo.Create("SystemStatus", "Free") + } + if err := settingRepo.Update("SystemStatus", "Free"); err != nil { + global.LOG.Fatalf("init service before start failed, err: %v", err) + } + + handleUserInfo(global.CONF.System.ChangeUserInfo, settingRepo) +} + +func handleUserInfo(tags string, settingRepo repo.ISettingRepo) { + if len(tags) == 0 { + return + } + if tags == "all" { + if err := settingRepo.Update("UserName", common.RandStrAndNum(10)); err != nil { + global.LOG.Fatalf("init username before start failed, err: %v", err) + } + pass, _ := encrypt.StringEncrypt(common.RandStrAndNum(10)) + if err := settingRepo.Update("Password", pass); err != nil { + global.LOG.Fatalf("init password before start failed, err: %v", err) + } + if err := settingRepo.Update("SecurityEntrance", common.RandStrAndNum(10)); err != nil { + global.LOG.Fatalf("init entrance before start failed, err: %v", err) + } + return + } + if strings.Contains(global.CONF.System.ChangeUserInfo, "username") { + if err := settingRepo.Update("UserName", common.RandStrAndNum(10)); err != nil { + global.LOG.Fatalf("init username before start failed, err: %v", err) + } + } + if strings.Contains(global.CONF.System.ChangeUserInfo, "password") { + pass, _ := encrypt.StringEncrypt(common.RandStrAndNum(10)) + if err := settingRepo.Update("Password", pass); err != nil { + global.LOG.Fatalf("init password before start failed, err: %v", err) + } + } + if strings.Contains(global.CONF.System.ChangeUserInfo, "entrance") { + if err := settingRepo.Update("SecurityEntrance", common.RandStrAndNum(10)); err != nil { + global.LOG.Fatalf("init entrance before start failed, err: %v", err) + } + } + + sudo := cmd.SudoHandleCmd() + _, _ = cmd.Execf("%s sed -i '/CHANGE_USER_INFO=%v/d' /usr/local/bin/1pctl", sudo, global.CONF.System.ChangeUserInfo) +} diff --git a/core/init/log/log.go b/core/init/log/log.go new file mode 100644 index 000000000..52dc8cdd6 --- /dev/null +++ b/core/init/log/log.go @@ -0,0 +1,67 @@ +package log + +import ( + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/configs" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/log" + + "github.com/sirupsen/logrus" +) + +const ( + TimeFormat = "2006-01-02 15:04:05" + FileTImeFormat = "2006-01-02" + RollingTimePattern = "0 0 * * *" +) + +func Init() { + l := logrus.New() + setOutput(l, global.CONF.LogConfig) + global.LOG = l + global.LOG.Info("init logger successfully") +} + +func setOutput(logger *logrus.Logger, config configs.LogConfig) { + writer, err := log.NewWriterFromConfig(&log.Config{ + LogPath: global.CONF.System.LogPath, + FileName: config.LogName, + TimeTagFormat: FileTImeFormat, + MaxRemain: config.MaxBackup, + RollingTimePattern: RollingTimePattern, + LogSuffix: config.LogSuffix, + }) + if err != nil { + panic(err) + } + level, err := logrus.ParseLevel(config.Level) + if err != nil { + panic(err) + } + fileAndStdoutWriter := io.MultiWriter(writer, os.Stdout) + + logger.SetOutput(fileAndStdoutWriter) + logger.SetLevel(level) + logger.SetFormatter(new(MineFormatter)) +} + +type MineFormatter struct{} + +func (s *MineFormatter) Format(entry *logrus.Entry) ([]byte, error) { + detailInfo := "" + if entry.Caller != nil { + function := strings.ReplaceAll(entry.Caller.Function, "github.com/1Panel-dev/1Panel/core/", "") + detailInfo = fmt.Sprintf("(%s: %d)", function, entry.Caller.Line) + } + if len(entry.Data) == 0 { + msg := fmt.Sprintf("[%s] [%s] %s %s \n", time.Now().Format(TimeFormat), strings.ToUpper(entry.Level.String()), entry.Message, detailInfo) + return []byte(msg), nil + } + msg := fmt.Sprintf("[%s] [%s] %s %s {%v} \n", time.Now().Format(TimeFormat), strings.ToUpper(entry.Level.String()), entry.Message, detailInfo, entry.Data) + return []byte(msg), nil +} diff --git a/core/init/migration/migrate.go b/core/init/migration/migrate.go new file mode 100644 index 000000000..ae28e8f44 --- /dev/null +++ b/core/init/migration/migrate.go @@ -0,0 +1,20 @@ +package migration + +import ( + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/init/migration/migrations" + + "github.com/go-gormigrate/gormigrate/v2" +) + +func Init() { + m := gormigrate.New(global.DB, gormigrate.DefaultOptions, []*gormigrate.Migration{ + migrations.Init, + migrations.InitSetting, + }) + if err := m.Migrate(); err != nil { + global.LOG.Error(err) + panic(err) + } + global.LOG.Info("Migration run successfully") +} diff --git a/core/init/migration/migrations/init.go b/core/init/migration/migrations/init.go new file mode 100644 index 000000000..fd1944a7d --- /dev/null +++ b/core/init/migration/migrations/init.go @@ -0,0 +1,123 @@ +package migrations + +import ( + "time" + + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/common" + "github.com/1Panel-dev/1Panel/core/utils/encrypt" + "github.com/go-gormigrate/gormigrate/v2" + "gorm.io/gorm" +) + +var Init = &gormigrate.Migration{ + ID: "20200809-add-table-operation-log", + Migrate: func(tx *gorm.DB) error { + return tx.AutoMigrate( + &model.OperationLog{}, + &model.LoginLog{}, + &model.Setting{}, + ) + }, +} + +var InitSetting = &gormigrate.Migration{ + ID: "20200908-add-table-setting", + Migrate: func(tx *gorm.DB) error { + encryptKey := common.RandStr(16) + if err := tx.Create(&model.Setting{Key: "UserName", Value: global.CONF.System.Username}).Error; err != nil { + return err + } + global.CONF.System.EncryptKey = encryptKey + pass, _ := encrypt.StringEncrypt(global.CONF.System.Password) + if err := tx.Create(&model.Setting{Key: "Password", Value: pass}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "Theme", Value: "light"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "MenuTabs", Value: "disable"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "PanelName", Value: "1Panel"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "Language", Value: "zh"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "SessionTimeout", Value: "86400"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "LocalTime", Value: ""}).Error; err != nil { + return err + } + + if err := tx.Create(&model.Setting{Key: "DeveloperMode", Value: "disable"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ProxyType", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ProxyUrl", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ProxyPort", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ProxyUser", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ProxyPasswd", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "PrsoxyPasswdKeep", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "XpackHideMenu", Value: "{\"id\":\"1\",\"label\":\"/xpack\",\"isCheck\":true,\"title\":\"xpack.menu\",\"children\":[{\"id\":\"2\",\"title\":\"xpack.waf.name\",\"path\":\"/xpack/waf/dashboard\",\"label\":\"Dashboard\",\"isCheck\":true},{\"id\":\"3\",\"title\":\"xpack.tamper.tamper\",\"path\":\"/xpack/tamper\",\"label\":\"Tamper\",\"isCheck\":true},{\"id\":\"4\",\"title\":\"xpack.gpu.gpu\",\"path\":\"/xpack/gpu\",\"label\":\"GPU\",\"isCheck\":true},{\"id\":\"5\",\"title\":\"xpack.setting.setting\",\"path\":\"/xpack/setting\",\"label\":\"XSetting\",\"isCheck\":true}]}"}).Error; err != nil { + return err + } + + if err := tx.Create(&model.Setting{Key: "ServerPort", Value: global.CONF.System.Port}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "SecurityEntrance", Value: global.CONF.System.Entrance}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "JWTSigningKey", Value: common.RandStr(16)}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "EncryptKey", Value: encryptKey}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ExpirationTime", Value: time.Now().AddDate(0, 0, 10).Format(constant.DateTimeLayout)}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ExpirationDays", Value: "0"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "ComplexityVerification", Value: "enable"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "MFAStatus", Value: "disable"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "MFASecret", Value: ""}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "SystemVersion", Value: global.CONF.System.Version}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "BindAddress", Value: "0.0.0.0"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "Ipv6", Value: "disable"}).Error; err != nil { + return err + } + if err := tx.Create(&model.Setting{Key: "NoAuthSetting", Value: "200"}).Error; err != nil { + return err + } + return nil + }, +} diff --git a/core/init/router/router.go b/core/init/router/router.go new file mode 100644 index 000000000..ba39d1274 --- /dev/null +++ b/core/init/router/router.go @@ -0,0 +1,76 @@ +package router + +import ( + "fmt" + "net/http" + + "github.com/1Panel-dev/1Panel/core/cmd/server/docs" + "github.com/1Panel-dev/1Panel/core/cmd/server/web" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/i18n" + "github.com/1Panel-dev/1Panel/core/middleware" + rou "github.com/1Panel-dev/1Panel/core/router" + "github.com/gin-contrib/gzip" + "github.com/gin-gonic/gin" + swaggerfiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" +) + +var ( + Router *gin.Engine +) + +func setWebStatic(rootRouter *gin.RouterGroup) { + rootRouter.StaticFS("/public", http.FS(web.Favicon)) + rootRouter.Static("/api/v1/images", "./uploads") + rootRouter.Use(func(c *gin.Context) { + c.Next() + }) + rootRouter.GET("/assets/*filepath", func(c *gin.Context) { + c.Writer.Header().Set("Cache-Control", fmt.Sprintf("private, max-age=%d", 3600)) + staticServer := http.FileServer(http.FS(web.Assets)) + staticServer.ServeHTTP(c.Writer, c.Request) + }) + rootRouter.GET("/", func(c *gin.Context) { + staticServer := http.FileServer(http.FS(web.IndexHtml)) + staticServer.ServeHTTP(c.Writer, c.Request) + }) +} + +func Routers() *gin.Engine { + Router = gin.Default() + Router.Use(middleware.OperationLog()) + if global.CONF.System.IsDemo { + Router.Use(middleware.DemoHandle()) + } + + Router.NoRoute(func(c *gin.Context) { + c.Writer.WriteHeader(http.StatusOK) + _, _ = c.Writer.Write(web.IndexByte) + c.Writer.Header().Add("Accept", "text/html") + c.Writer.Flush() + }) + + Router.Use(i18n.UseI18n()) + + swaggerRouter := Router.Group("1panel") + docs.SwaggerInfo.BasePath = "/api/v1" + swaggerRouter.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler)) + PublicGroup := Router.Group("") + { + PublicGroup.GET("/health", func(c *gin.Context) { + c.JSON(200, "ok") + }) + PublicGroup.Use(gzip.Gzip(gzip.DefaultCompression)) + setWebStatic(PublicGroup) + } + PrivateGroup := Router.Group("/api/v1") + PrivateGroup.Use(middleware.WhiteAllow()) + PrivateGroup.Use(middleware.BindDomain()) + PrivateGroup.Use(middleware.GlobalLoading()) + for _, router := range rou.RouterGroupApp { + router.InitRouter(PrivateGroup) + } + + return Router +} diff --git a/core/init/session/psession/psession.go b/core/init/session/psession/psession.go new file mode 100644 index 000000000..55d7ffed2 --- /dev/null +++ b/core/init/session/psession/psession.go @@ -0,0 +1,47 @@ +package psession + +import ( + "encoding/json" + "time" + + "github.com/1Panel-dev/1Panel/core/init/cache/badger_db" +) + +type SessionUser struct { + ID uint `json:"id"` + Name string `json:"name"` +} + +type PSession struct { + ExpireTime int64 `json:"expire_time"` + store *badger_db.Cache +} + +func NewPSession(db *badger_db.Cache) *PSession { + return &PSession{ + store: db, + } +} + +func (p *PSession) Get(sessionID string) (SessionUser, error) { + var result SessionUser + item, err := p.store.Get(sessionID) + if err != nil { + return result, err + } + _ = json.Unmarshal(item, &result) + return result, nil +} + +func (p *PSession) Set(sessionID string, user SessionUser, ttlSeconds int) error { + p.ExpireTime = time.Now().Unix() + int64(ttlSeconds) + return p.store.SetWithTTL(sessionID, user, time.Second*time.Duration(ttlSeconds)) +} + +func (p *PSession) Delete(sessionID string) error { + return p.store.Del(sessionID) +} + +func (p *PSession) Clean() error { + return p.store.Clean() +} diff --git a/core/init/session/session.go b/core/init/session/session.go new file mode 100644 index 000000000..3a0fd5927 --- /dev/null +++ b/core/init/session/session.go @@ -0,0 +1,11 @@ +package session + +import ( + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/init/session/psession" +) + +func Init() { + global.SESSION = psession.NewPSession(global.CACHE) + global.LOG.Info("init session successfully") +} diff --git a/core/init/validator/validator.go b/core/init/validator/validator.go new file mode 100644 index 000000000..06cb69432 --- /dev/null +++ b/core/init/validator/validator.go @@ -0,0 +1,65 @@ +package validator + +import ( + "regexp" + "unicode" + + "github.com/1Panel-dev/1Panel/core/global" + + "github.com/go-playground/validator/v10" +) + +func Init() { + validator := validator.New() + if err := validator.RegisterValidation("name", checkNamePattern); err != nil { + panic(err) + } + if err := validator.RegisterValidation("ip", checkIpPattern); err != nil { + panic(err) + } + if err := validator.RegisterValidation("password", checkPasswordPattern); err != nil { + panic(err) + } + global.VALID = validator +} + +func checkNamePattern(fl validator.FieldLevel) bool { + value := fl.Field().String() + result, err := regexp.MatchString("^[a-zA-Z\u4e00-\u9fa5]{1}[a-zA-Z0-9_\u4e00-\u9fa5]{0,30}$", value) + if err != nil { + global.LOG.Errorf("regexp matchString failed, %v", err) + } + return result +} + +func checkIpPattern(fl validator.FieldLevel) bool { + value := fl.Field().String() + result, err := regexp.MatchString(`^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$`, value) + if err != nil { + global.LOG.Errorf("regexp check ip matchString failed, %v", err) + } + return result +} + +func checkPasswordPattern(fl validator.FieldLevel) bool { + value := fl.Field().String() + if len(value) < 8 || len(value) > 30 { + return false + } + + hasNum := false + hasLetter := false + for _, r := range value { + if unicode.IsLetter(r) && !hasLetter { + hasLetter = true + } + if unicode.IsNumber(r) && !hasNum { + hasNum = true + } + if hasLetter && hasNum { + return true + } + } + + return false +} diff --git a/core/init/viper/viper.go b/core/init/viper/viper.go new file mode 100644 index 000000000..8e38c1ce4 --- /dev/null +++ b/core/init/viper/viper.go @@ -0,0 +1,122 @@ +package viper + +import ( + "bytes" + "fmt" + "os" + "path" + "strings" + + "github.com/1Panel-dev/1Panel/core/cmd/server/conf" + "github.com/1Panel-dev/1Panel/core/configs" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + "github.com/fsnotify/fsnotify" + "github.com/spf13/viper" + "gopkg.in/yaml.v3" +) + +func Init() { + baseDir := "/opt" + port := "9999" + mode := "" + version := "v1.0.0" + username, password, entrance := "", "", "" + v := viper.NewWithOptions() + v.SetConfigType("yaml") + + config := configs.ServerConfig{} + if err := yaml.Unmarshal(conf.AppYaml, &config); err != nil { + panic(err) + } + if config.System.Mode != "" { + mode = config.System.Mode + } + _, err := os.Stat("/opt/1panel/conf/app.yaml") + if mode == "dev" && err == nil { + v.SetConfigName("app") + v.AddConfigPath(path.Join("/opt/1panel/conf")) + if err := v.ReadInConfig(); err != nil { + panic(fmt.Errorf("Fatal error config file: %s \n", err)) + } + } else { + baseDir = loadParams("BASE_DIR") + port = loadParams("ORIGINAL_PORT") + version = loadParams("ORIGINAL_VERSION") + username = loadParams("ORIGINAL_USERNAME") + password = loadParams("ORIGINAL_PASSWORD") + entrance = loadParams("ORIGINAL_ENTRANCE") + + reader := bytes.NewReader(conf.AppYaml) + if err := v.ReadConfig(reader); err != nil { + panic(fmt.Errorf("Fatal error config file: %s \n", err)) + } + } + v.OnConfigChange(func(e fsnotify.Event) { + if err := v.Unmarshal(&global.CONF); err != nil { + panic(err) + } + }) + serverConfig := configs.ServerConfig{} + if err := v.Unmarshal(&serverConfig); err != nil { + panic(err) + } + _, err = os.Stat("/opt/1panel/conf/app.yaml") + if mode == "dev" && err == nil { + if serverConfig.System.BaseDir != "" { + baseDir = serverConfig.System.BaseDir + } + if serverConfig.System.Port != "" { + port = serverConfig.System.Port + } + if serverConfig.System.Version != "" { + version = serverConfig.System.Version + } + if serverConfig.System.Username != "" { + username = serverConfig.System.Username + } + if serverConfig.System.Password != "" { + password = serverConfig.System.Password + } + if serverConfig.System.Entrance != "" { + entrance = serverConfig.System.Entrance + } + } + + global.CONF = serverConfig + global.CONF.System.BaseDir = baseDir + global.CONF.System.IsDemo = v.GetBool("system.is_demo") + global.CONF.System.DataDir = path.Join(global.CONF.System.BaseDir, "1panel") + global.CONF.System.Cache = path.Join(global.CONF.System.DataDir, "cache") + global.CONF.System.Backup = path.Join(global.CONF.System.DataDir, "backup") + global.CONF.System.DbPath = path.Join(global.CONF.System.DataDir, "db") + global.CONF.System.LogPath = path.Join(global.CONF.System.DataDir, "log") + global.CONF.System.TmpDir = path.Join(global.CONF.System.DataDir, "tmp") + global.CONF.System.Port = port + global.CONF.System.Version = version + global.CONF.System.Username = username + global.CONF.System.Password = password + global.CONF.System.Entrance = entrance + global.CONF.System.ChangeUserInfo = loadChangeInfo() + global.Viper = v +} + +func loadParams(param string) string { + stdout, err := cmd.Execf("grep '^%s=' /usr/local/bin/1pctl | cut -d'=' -f2", param) + if err != nil { + panic(err) + } + info := strings.ReplaceAll(stdout, "\n", "") + if len(info) == 0 || info == `""` { + panic(fmt.Sprintf("error `%s` find in /usr/local/bin/1pctl", param)) + } + return info +} + +func loadChangeInfo() string { + stdout, err := cmd.Exec("grep '^CHANGE_USER_INFO=' /usr/local/bin/1pctl | cut -d'=' -f2") + if err != nil { + return "" + } + return strings.ReplaceAll(stdout, "\n", "") +} diff --git a/core/log/config.go b/core/log/config.go new file mode 100644 index 000000000..08c1d6173 --- /dev/null +++ b/core/log/config.go @@ -0,0 +1,41 @@ +package log + +import ( + "errors" + "io" + "os" + "path" +) + +var ( + BufferSize = 0x100000 + DefaultFileMode = os.FileMode(0644) + DefaultFileFlag = os.O_RDWR | os.O_CREATE | os.O_APPEND + ErrInvalidArgument = errors.New("error argument invalid") + QueueSize = 1024 + ErrClosed = errors.New("error write on close") +) + +type Config struct { + TimeTagFormat string + LogPath string + FileName string + LogSuffix string + MaxRemain int + RollingTimePattern string +} + +type Manager interface { + Fire() chan string + Close() +} + +type RollingWriter interface { + io.Writer + Close() error +} + +func FilePath(c *Config) (filepath string) { + filepath = path.Join(c.LogPath, c.FileName) + c.LogSuffix + return +} diff --git a/core/log/dup_write_darwin.go b/core/log/dup_write_darwin.go new file mode 100644 index 000000000..822d24e82 --- /dev/null +++ b/core/log/dup_write_darwin.go @@ -0,0 +1,20 @@ +package log + +import ( + "golang.org/x/sys/unix" + "os" + "runtime" +) + +var stdErrFileHandler *os.File + +func dupWrite(file *os.File) error { + stdErrFileHandler = file + if err := unix.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil { + return err + } + runtime.SetFinalizer(stdErrFileHandler, func(fd *os.File) { + fd.Close() + }) + return nil +} diff --git a/core/log/dup_write_linux.go b/core/log/dup_write_linux.go new file mode 100644 index 000000000..822d24e82 --- /dev/null +++ b/core/log/dup_write_linux.go @@ -0,0 +1,20 @@ +package log + +import ( + "golang.org/x/sys/unix" + "os" + "runtime" +) + +var stdErrFileHandler *os.File + +func dupWrite(file *os.File) error { + stdErrFileHandler = file + if err := unix.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil { + return err + } + runtime.SetFinalizer(stdErrFileHandler, func(fd *os.File) { + fd.Close() + }) + return nil +} diff --git a/core/log/dup_write_windows.go b/core/log/dup_write_windows.go new file mode 100644 index 000000000..4996cc12d --- /dev/null +++ b/core/log/dup_write_windows.go @@ -0,0 +1,9 @@ +package log + +import ( + "os" +) + +func dupWrite(file *os.File) error { + return nil +} diff --git a/core/log/manager.go b/core/log/manager.go new file mode 100644 index 000000000..1f4f94546 --- /dev/null +++ b/core/log/manager.go @@ -0,0 +1,53 @@ +package log + +import ( + "github.com/robfig/cron/v3" + "path" + "sync" + "time" +) + +type manager struct { + startAt time.Time + fire chan string + cr *cron.Cron + context chan int + wg sync.WaitGroup + lock sync.Mutex +} + +func (m *manager) Fire() chan string { + return m.fire +} + +func (m *manager) Close() { + close(m.context) + m.cr.Stop() +} + +func NewManager(c *Config) (Manager, error) { + m := &manager{ + startAt: time.Now(), + cr: cron.New(), + fire: make(chan string), + context: make(chan int), + wg: sync.WaitGroup{}, + } + + if _, err := m.cr.AddFunc(c.RollingTimePattern, func() { + m.fire <- m.GenLogFileName(c) + }); err != nil { + return nil, err + } + m.cr.Start() + + return m, nil +} + +func (m *manager) GenLogFileName(c *Config) (filename string) { + m.lock.Lock() + filename = path.Join(c.LogPath, c.FileName+"-"+m.startAt.Format(c.TimeTagFormat)) + c.LogSuffix + m.startAt = time.Now() + m.lock.Unlock() + return +} diff --git a/core/log/writer.go b/core/log/writer.go new file mode 100644 index 000000000..391a2f3ac --- /dev/null +++ b/core/log/writer.go @@ -0,0 +1,250 @@ +package log + +import ( + "log" + "os" + "path" + "sort" + "strings" + "sync" + "sync/atomic" + "time" + "unsafe" + + "github.com/1Panel-dev/1Panel/core/global" +) + +type Writer struct { + m Manager + file *os.File + absPath string + fire chan string + cf *Config + rollingfilech chan string +} + +type AsynchronousWriter struct { + Writer + ctx chan int + queue chan []byte + errChan chan error + closed int32 + wg sync.WaitGroup +} + +func (w *AsynchronousWriter) Close() error { + if atomic.CompareAndSwapInt32(&w.closed, 0, 1) { + close(w.ctx) + w.onClose() + + func() { + defer func() { + if r := recover(); r != nil { + global.LOG.Error(r) + } + }() + w.m.Close() + }() + return w.file.Close() + } + return ErrClosed +} + +func (w *AsynchronousWriter) onClose() { + var err error + for { + select { + case b := <-w.queue: + if _, err = w.file.Write(b); err != nil { + select { + case w.errChan <- err: + default: + _asyncBufferPool.Put(&b) + return + } + } + _asyncBufferPool.Put(&b) + default: + return + } + } +} + +var _asyncBufferPool = sync.Pool{ + New: func() interface{} { + return make([]byte, BufferSize) + }, +} + +func NewWriterFromConfig(c *Config) (RollingWriter, error) { + if c.LogPath == "" || c.FileName == "" { + return nil, ErrInvalidArgument + } + if err := os.MkdirAll(c.LogPath, 0700); err != nil { + return nil, err + } + filepath := FilePath(c) + file, err := os.OpenFile(filepath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) + if err != nil { + return nil, err + } + if err := dupWrite(file); err != nil { + return nil, err + } + mng, err := NewManager(c) + if err != nil { + return nil, err + } + + var rollingWriter RollingWriter + writer := Writer{ + m: mng, + file: file, + absPath: filepath, + fire: mng.Fire(), + cf: c, + } + if c.MaxRemain > 0 { + writer.rollingfilech = make(chan string, c.MaxRemain) + dir, err := os.ReadDir(c.LogPath) + if err != nil { + mng.Close() + return nil, err + } + + files := make([]string, 0, 10) + for _, fi := range dir { + if fi.IsDir() { + continue + } + + fileName := c.FileName + if strings.Contains(fi.Name(), fileName) && strings.Contains(fi.Name(), c.LogSuffix) { + start := strings.Index(fi.Name(), "-") + end := strings.Index(fi.Name(), c.LogSuffix) + name := fi.Name() + if start > 0 && end > 0 { + _, err := time.Parse(c.TimeTagFormat, name[start+1:end]) + if err == nil { + files = append(files, fi.Name()) + } + } + } + } + sort.Slice(files, func(i, j int) bool { + t1Start := strings.Index(files[i], "-") + t1End := strings.Index(files[i], c.LogSuffix) + t2Start := strings.Index(files[i], "-") + t2End := strings.Index(files[i], c.LogSuffix) + t1, _ := time.Parse(c.TimeTagFormat, files[i][t1Start+1:t1End]) + t2, _ := time.Parse(c.TimeTagFormat, files[j][t2Start+1:t2End]) + return t1.Before(t2) + }) + + for _, file := range files { + retry: + select { + case writer.rollingfilech <- path.Join(c.LogPath, file): + default: + writer.DoRemove() + goto retry + } + } + } + + wr := &AsynchronousWriter{ + ctx: make(chan int), + queue: make(chan []byte, QueueSize), + errChan: make(chan error, QueueSize), + wg: sync.WaitGroup{}, + closed: 0, + Writer: writer, + } + + wr.wg.Add(1) + go wr.writer() + wr.wg.Wait() + rollingWriter = wr + + return rollingWriter, nil +} + +func (w *AsynchronousWriter) writer() { + var err error + w.wg.Done() + for { + select { + case filename := <-w.fire: + if err = w.Reopen(filename); err != nil && len(w.errChan) < cap(w.errChan) { + w.errChan <- err + } + case b := <-w.queue: + if _, err = w.file.Write(b); err != nil && len(w.errChan) < cap(w.errChan) { + w.errChan <- err + } + _asyncBufferPool.Put(&b) + case <-w.ctx: + return + } + } +} + +func (w *Writer) DoRemove() { + file := <-w.rollingfilech + if err := os.Remove(file); err != nil { + log.Println("error in remove log file", file, err) + } +} + +func (w *Writer) Write(b []byte) (int, error) { + var ok = false + for !ok { + select { + case filename := <-w.fire: + if err := w.Reopen(filename); err != nil { + return 0, err + } + default: + ok = true + } + } + + fp := atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&w.file))) + file := (*os.File)(fp) + return file.Write(b) +} + +func (w *Writer) Reopen(file string) error { + fileInfo, err := w.file.Stat() + if err != nil { + return err + } + + if fileInfo.Size() == 0 { + return nil + } + + w.file.Close() + if err := os.Rename(w.absPath, file); err != nil { + return err + } + newFile, err := os.OpenFile(w.absPath, DefaultFileFlag, DefaultFileMode) + if err != nil { + return err + } + + w.file = newFile + + go func() { + if w.cf.MaxRemain > 0 { + retry: + select { + case w.rollingfilech <- file: + default: + w.DoRemove() + goto retry + } + } + }() + return nil +} diff --git a/core/main.go b/core/main.go new file mode 100644 index 000000000..fbfa86301 --- /dev/null +++ b/core/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "fmt" + "os" + + _ "net/http/pprof" + + "github.com/1Panel-dev/1Panel/core/cmd/server/cmd" + _ "github.com/1Panel-dev/1Panel/core/cmd/server/docs" +) + +// @title 1Panel +// @version 1.0 +// @description 开源Linux面板 +// @termsOfService http://swagger.io/terms/ +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html +// @host localhost +// @BasePath /api/v1 + +//go:generate swag init -o ./docs -g main.go -d ../../backend -g ../cmd/server/main.go +func main() { + if err := cmd.RootCmd.Execute(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/core/middleware/bind_domain.go b/core/middleware/bind_domain.go new file mode 100644 index 000000000..09c33a540 --- /dev/null +++ b/core/middleware/bind_domain.go @@ -0,0 +1,41 @@ +package middleware + +import ( + "errors" + "strings" + + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/gin-gonic/gin" +) + +func BindDomain() gin.HandlerFunc { + return func(c *gin.Context) { + settingRepo := repo.NewISettingRepo() + status, err := settingRepo.Get(settingRepo.WithByKey("BindDomain")) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + if len(status.Value) == 0 { + c.Next() + return + } + domains := c.Request.Host + parts := strings.Split(c.Request.Host, ":") + if len(parts) > 0 { + domains = parts[0] + } + + if domains != status.Value { + if LoadErrCode("err-domain") != 200 { + helper.ErrResponse(c, LoadErrCode("err-domain")) + return + } + helper.ErrorWithDetail(c, constant.CodeErrDomain, constant.ErrTypeInternalServer, errors.New("domain not allowed")) + return + } + c.Next() + } +} diff --git a/core/middleware/demo_handle.go b/core/middleware/demo_handle.go new file mode 100644 index 000000000..943f23491 --- /dev/null +++ b/core/middleware/demo_handle.go @@ -0,0 +1,57 @@ +package middleware + +import ( + "net/http" + "strings" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/buserr" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/gin-gonic/gin" +) + +var whiteUrlList = map[string]struct{}{ + "/api/v1/auth/login": {}, + "/api/v1/websites/config": {}, + "/api/v1/websites/waf/config": {}, + "/api/v1/files/loadfile": {}, + "/api/v1/files/size": {}, + "/api/v1/logs/operation": {}, + "/api/v1/logs/login": {}, + "/api/v1/auth/logout": {}, + + "/api/v1/apps/installed/loadport": {}, + "/api/v1/apps/installed/check": {}, + "/api/v1/apps/installed/conninfo": {}, + "/api/v1/databases/load/file": {}, + "/api/v1/databases/variables": {}, + "/api/v1/databases/status": {}, + "/api/v1/databases/baseinfo": {}, + + "/api/v1/waf/attack/stat": {}, + "/api/v1/waf/config/website": {}, + + "/api/v1/monitor/stat": {}, + "/api/v1/monitor/visitors": {}, + "/api/v1/monitor/visitors/loc": {}, + "/api/v1/monitor/qps": {}, +} + +func DemoHandle() gin.HandlerFunc { + return func(c *gin.Context) { + if strings.Contains(c.Request.URL.Path, "search") || c.Request.Method == http.MethodGet { + c.Next() + return + } + if _, ok := whiteUrlList[c.Request.URL.Path]; ok { + c.Next() + return + } + + c.JSON(http.StatusInternalServerError, dto.Response{ + Code: http.StatusInternalServerError, + Message: buserr.New(constant.ErrDemoEnvironment).Error(), + }) + c.Abort() + } +} diff --git a/core/middleware/helper.go b/core/middleware/helper.go new file mode 100644 index 000000000..124b69588 --- /dev/null +++ b/core/middleware/helper.go @@ -0,0 +1,32 @@ +package middleware + +import ( + "net/http" + + "github.com/1Panel-dev/1Panel/core/app/repo" +) + +func LoadErrCode(errInfo string) int { + settingRepo := repo.NewISettingRepo() + codeVal, err := settingRepo.Get(settingRepo.WithByKey("NoAuthSetting")) + if err != nil { + return 500 + } + + switch codeVal.Value { + case "400": + return http.StatusBadRequest + case "401": + return http.StatusUnauthorized + case "403": + return http.StatusForbidden + case "404": + return http.StatusNotFound + case "408": + return http.StatusRequestTimeout + case "416": + return http.StatusRequestedRangeNotSatisfiable + default: + return http.StatusOK + } +} diff --git a/core/middleware/ip_limit.go b/core/middleware/ip_limit.go new file mode 100644 index 000000000..86243ff38 --- /dev/null +++ b/core/middleware/ip_limit.go @@ -0,0 +1,67 @@ +package middleware + +import ( + "errors" + "net" + "strings" + + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/gin-gonic/gin" +) + +func WhiteAllow() gin.HandlerFunc { + return func(c *gin.Context) { + settingRepo := repo.NewISettingRepo() + status, err := settingRepo.Get(settingRepo.WithByKey("AllowIPs")) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + + if len(status.Value) == 0 { + c.Next() + return + } + clientIP := c.ClientIP() + for _, ip := range strings.Split(status.Value, ",") { + if len(ip) == 0 { + continue + } + if ip == clientIP || (strings.Contains(ip, "/") && checkIpInCidr(ip, clientIP)) { + c.Next() + return + } + } + if LoadErrCode("err-ip") != 200 { + helper.ErrResponse(c, LoadErrCode("err-ip")) + return + } + helper.ErrorWithDetail(c, constant.CodeErrIP, constant.ErrTypeInternalServer, errors.New("IP address not allowed")) + } +} + +func checkIpInCidr(cidr, checkIP string) bool { + ip, ipNet, err := net.ParseCIDR(cidr) + if err != nil { + global.LOG.Errorf("parse CIDR %s failed, err: %v", cidr, err) + return false + } + for ip := ip.Mask(ipNet.Mask); ipNet.Contains(ip); incIP(ip) { + if ip.String() == checkIP { + return true + } + } + return false +} + +func incIP(ip net.IP) { + for j := len(ip) - 1; j >= 0; j-- { + ip[j]++ + if ip[j] > 0 { + break + } + } +} diff --git a/core/middleware/jwt.go b/core/middleware/jwt.go new file mode 100644 index 000000000..010aa13d0 --- /dev/null +++ b/core/middleware/jwt.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/constant" + jwtUtils "github.com/1Panel-dev/1Panel/core/utils/jwt" + + "github.com/gin-gonic/gin" +) + +func JwtAuth() gin.HandlerFunc { + return func(c *gin.Context) { + token := c.Request.Header.Get(constant.JWTHeaderName) + if token == "" { + c.Next() + return + } + j := jwtUtils.NewJWT() + claims, err := j.ParseToken(token) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrUnauthorized, constant.ErrTypeInternalServer, err) + return + } + c.Set("claims", claims) + c.Set("authMethod", constant.AuthMethodJWT) + c.Next() + } +} diff --git a/core/middleware/loading.go b/core/middleware/loading.go new file mode 100644 index 000000000..0727b7238 --- /dev/null +++ b/core/middleware/loading.go @@ -0,0 +1,24 @@ +package middleware + +import ( + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/gin-gonic/gin" +) + +func GlobalLoading() gin.HandlerFunc { + return func(c *gin.Context) { + settingRepo := repo.NewISettingRepo() + status, err := settingRepo.Get(settingRepo.WithByKey("SystemStatus")) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + if status.Value != "Free" { + helper.ErrorWithDetail(c, constant.CodeGlobalLoading, status.Value, err) + return + } + c.Next() + } +} diff --git a/core/middleware/operation.go b/core/middleware/operation.go new file mode 100644 index 000000000..a357649b1 --- /dev/null +++ b/core/middleware/operation.go @@ -0,0 +1,216 @@ +package middleware + +import ( + "bytes" + "compress/gzip" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/app/service" + "github.com/1Panel-dev/1Panel/core/cmd/server/docs" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/copier" + "github.com/gin-gonic/gin" +) + +func OperationLog() gin.HandlerFunc { + return func(c *gin.Context) { + if strings.Contains(c.Request.URL.Path, "search") || c.Request.Method == http.MethodGet { + c.Next() + return + } + + source := loadLogInfo(c.Request.URL.Path) + record := model.OperationLog{ + Source: source, + IP: c.ClientIP(), + Method: strings.ToLower(c.Request.Method), + Path: strings.ReplaceAll(c.Request.URL.Path, "/api/v1", ""), + UserAgent: c.Request.UserAgent(), + } + var ( + swagger swaggerJson + operationDic operationJson + ) + if err := json.Unmarshal(docs.SwaggerJson, &swagger); err != nil { + c.Next() + return + } + path, hasPath := swagger.Paths[record.Path] + if !hasPath { + c.Next() + return + } + methodMap, isMethodMap := path.(map[string]interface{}) + if !isMethodMap { + c.Next() + return + } + dataMap, hasPost := methodMap["post"] + if !hasPost { + c.Next() + return + } + data, isDataMap := dataMap.(map[string]interface{}) + if !isDataMap { + c.Next() + return + } + xlog, hasXlog := data["x-panel-log"] + if !hasXlog { + c.Next() + return + } + if err := copier.Copy(&operationDic, xlog); err != nil { + c.Next() + return + } + if len(operationDic.FormatZH) == 0 { + c.Next() + return + } + + formatMap := make(map[string]interface{}) + if len(operationDic.BodyKeys) != 0 { + body, err := io.ReadAll(c.Request.Body) + if err == nil { + c.Request.Body = io.NopCloser(bytes.NewBuffer(body)) + } + bodyMap := make(map[string]interface{}) + _ = json.Unmarshal(body, &bodyMap) + for _, key := range operationDic.BodyKeys { + if _, ok := bodyMap[key]; ok { + formatMap[key] = bodyMap[key] + } + } + } + if len(operationDic.BeforeFunctions) != 0 { + for _, funcs := range operationDic.BeforeFunctions { + for key, value := range formatMap { + if funcs.InputValue == key { + var names []string + if funcs.IsList { + sql := fmt.Sprintf("SELECT %s FROM %s where %s in (?);", funcs.OutputColumn, funcs.DB, funcs.InputColumn) + _ = global.DB.Raw(sql, value).Scan(&names) + } else { + _ = global.DB.Raw(fmt.Sprintf("select %s from %s where %s = ?;", funcs.OutputColumn, funcs.DB, funcs.InputColumn), value).Scan(&names) + } + formatMap[funcs.OutputValue] = strings.Join(names, ",") + break + } + } + } + } + for key, value := range formatMap { + if strings.Contains(operationDic.FormatEN, "["+key+"]") { + if arrays, ok := value.([]string); ok { + operationDic.FormatZH = strings.ReplaceAll(operationDic.FormatZH, "["+key+"]", fmt.Sprintf("[%v]", strings.Join(arrays, ","))) + operationDic.FormatEN = strings.ReplaceAll(operationDic.FormatEN, "["+key+"]", fmt.Sprintf("[%v]", strings.Join(arrays, ","))) + } else { + operationDic.FormatZH = strings.ReplaceAll(operationDic.FormatZH, "["+key+"]", fmt.Sprintf("[%v]", value)) + operationDic.FormatEN = strings.ReplaceAll(operationDic.FormatEN, "["+key+"]", fmt.Sprintf("[%v]", value)) + } + } + } + record.DetailEN = strings.ReplaceAll(operationDic.FormatEN, "[]", "") + record.DetailZH = strings.ReplaceAll(operationDic.FormatZH, "[]", "") + + writer := responseBodyWriter{ + ResponseWriter: c.Writer, + body: &bytes.Buffer{}, + } + c.Writer = writer + now := time.Now() + + c.Next() + + datas := writer.body.Bytes() + if c.Request.Header.Get("Content-Encoding") == "gzip" { + buf := bytes.NewReader(writer.body.Bytes()) + reader, err := gzip.NewReader(buf) + if err != nil { + record.Status = constant.StatusFailed + record.Message = fmt.Sprintf("gzip new reader failed, err: %v", err) + latency := time.Since(now) + record.Latency = latency + + if err := service.NewILogService().CreateOperationLog(record); err != nil { + global.LOG.Errorf("create operation record failed, err: %v", err) + } + return + } + defer reader.Close() + datas, _ = io.ReadAll(reader) + } + var res response + _ = json.Unmarshal(datas, &res) + if res.Code == 200 { + record.Status = constant.StatusSuccess + } else { + record.Status = constant.StatusFailed + record.Message = res.Message + } + + latency := time.Since(now) + record.Latency = latency + + if err := service.NewILogService().CreateOperationLog(record); err != nil { + global.LOG.Errorf("create operation record failed, err: %v", err) + } + } +} + +type swaggerJson struct { + Paths map[string]interface{} `json:"paths"` +} + +type operationJson struct { + API string `json:"api"` + Method string `json:"method"` + BodyKeys []string `json:"bodyKeys"` + ParamKeys []string `json:"paramKeys"` + BeforeFunctions []functionInfo `json:"beforeFunctions"` + FormatZH string `json:"formatZH"` + FormatEN string `json:"formatEN"` +} +type functionInfo struct { + InputColumn string `json:"input_column"` + InputValue string `json:"input_value"` + IsList bool `json:"isList"` + DB string `json:"db"` + OutputColumn string `json:"output_column"` + OutputValue string `json:"output_value"` +} + +type response struct { + Code int `json:"code"` + Message string `json:"message"` +} + +type responseBodyWriter struct { + gin.ResponseWriter + body *bytes.Buffer +} + +func (r responseBodyWriter) Write(b []byte) (int, error) { + r.body.Write(b) + return r.ResponseWriter.Write(b) +} + +func loadLogInfo(path string) string { + path = strings.ReplaceAll(path, "/api/v1", "") + if !strings.Contains(path, "/") { + return "" + } + pathArrays := strings.Split(path, "/") + if len(pathArrays) < 2 { + return "" + } + return pathArrays[1] +} diff --git a/core/middleware/password_expired.go b/core/middleware/password_expired.go new file mode 100644 index 000000000..a69c10884 --- /dev/null +++ b/core/middleware/password_expired.go @@ -0,0 +1,45 @@ +package middleware + +import ( + "strconv" + "time" + + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/utils/common" + "github.com/gin-gonic/gin" +) + +func PasswordExpired() gin.HandlerFunc { + return func(c *gin.Context) { + settingRepo := repo.NewISettingRepo() + setting, err := settingRepo.Get(settingRepo.WithByKey("ExpirationDays")) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypePasswordExpired, err) + return + } + expiredDays, _ := strconv.Atoi(setting.Value) + if expiredDays == 0 { + c.Next() + return + } + + extime, err := settingRepo.Get(settingRepo.WithByKey("ExpirationTime")) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypePasswordExpired, err) + return + } + loc, _ := time.LoadLocation(common.LoadTimeZone()) + expiredTime, err := time.ParseInLocation(constant.DateTimeLayout, extime.Value, loc) + if err != nil { + helper.ErrorWithDetail(c, constant.CodePasswordExpired, constant.ErrTypePasswordExpired, err) + return + } + if time.Now().After(expiredTime) { + helper.ErrorWithDetail(c, constant.CodePasswordExpired, constant.ErrTypePasswordExpired, err) + return + } + c.Next() + } +} diff --git a/core/middleware/session.go b/core/middleware/session.go new file mode 100644 index 000000000..469b6d5f3 --- /dev/null +++ b/core/middleware/session.go @@ -0,0 +1,38 @@ +package middleware + +import ( + "strconv" + + "github.com/1Panel-dev/1Panel/core/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/gin-gonic/gin" +) + +func SessionAuth() gin.HandlerFunc { + return func(c *gin.Context) { + if method, exist := c.Get("authMethod"); exist && method == constant.AuthMethodJWT { + c.Next() + return + } + sId, err := c.Cookie(constant.SessionName) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrUnauthorized, constant.ErrTypeNotLogin, nil) + return + } + psession, err := global.SESSION.Get(sId) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrUnauthorized, constant.ErrTypeNotLogin, nil) + return + } + settingRepo := repo.NewISettingRepo() + setting, err := settingRepo.Get(settingRepo.WithByKey("SessionTimeout")) + if err != nil { + global.LOG.Errorf("create operation record failed, err: %v", err) + } + lifeTime, _ := strconv.Atoi(setting.Value) + _ = global.SESSION.Set(sId, psession, lifeTime) + c.Next() + } +} diff --git a/core/router/common.go b/core/router/common.go new file mode 100644 index 000000000..fada5160c --- /dev/null +++ b/core/router/common.go @@ -0,0 +1,9 @@ +package router + +func commonGroups() []CommonRouter { + return []CommonRouter{ + &BaseRouter{}, + &LogRouter{}, + &SettingRouter{}, + } +} diff --git a/core/router/entry.go b/core/router/entry.go new file mode 100644 index 000000000..49ed25fd1 --- /dev/null +++ b/core/router/entry.go @@ -0,0 +1,9 @@ +//go:build !xpack + +package router + +func RouterGroups() []CommonRouter { + return commonGroups() +} + +var RouterGroupApp = RouterGroups() diff --git a/core/router/ro_base.go b/core/router/ro_base.go new file mode 100644 index 000000000..f11cbf4d3 --- /dev/null +++ b/core/router/ro_base.go @@ -0,0 +1,22 @@ +package router + +import ( + v1 "github.com/1Panel-dev/1Panel/core/app/api/v1" + "github.com/gin-gonic/gin" +) + +type BaseRouter struct{} + +func (s *BaseRouter) InitRouter(Router *gin.RouterGroup) { + baseRouter := Router.Group("auth") + baseApi := v1.ApiGroupApp.BaseApi + { + baseRouter.GET("/captcha", baseApi.Captcha) + baseRouter.POST("/mfalogin", baseApi.MFALogin) + baseRouter.POST("/login", baseApi.Login) + baseRouter.GET("/issafety", baseApi.CheckIsSafety) + baseRouter.POST("/logout", baseApi.LogOut) + baseRouter.GET("/demo", baseApi.CheckIsDemo) + baseRouter.GET("/language", baseApi.GetLanguage) + } +} diff --git a/core/router/ro_log.go b/core/router/ro_log.go new file mode 100644 index 000000000..f1c7c10fc --- /dev/null +++ b/core/router/ro_log.go @@ -0,0 +1,21 @@ +package router + +import ( + v1 "github.com/1Panel-dev/1Panel/core/app/api/v1" + "github.com/1Panel-dev/1Panel/core/middleware" + + "github.com/gin-gonic/gin" +) + +type LogRouter struct{} + +func (s *LogRouter) InitRouter(Router *gin.RouterGroup) { + operationRouter := Router.Group("logs") + operationRouter.Use(middleware.JwtAuth()).Use(middleware.SessionAuth()).Use(middleware.PasswordExpired()) + baseApi := v1.ApiGroupApp.BaseApi + { + operationRouter.POST("/login", baseApi.GetLoginLogs) + operationRouter.POST("/operation", baseApi.GetOperationLogs) + operationRouter.POST("/clean", baseApi.CleanLogs) + } +} diff --git a/core/router/ro_router.go b/core/router/ro_router.go new file mode 100644 index 000000000..58a52dce0 --- /dev/null +++ b/core/router/ro_router.go @@ -0,0 +1,7 @@ +package router + +import "github.com/gin-gonic/gin" + +type CommonRouter interface { + InitRouter(Router *gin.RouterGroup) +} diff --git a/core/router/ro_setting.go b/core/router/ro_setting.go new file mode 100644 index 000000000..05a0efd4a --- /dev/null +++ b/core/router/ro_setting.go @@ -0,0 +1,42 @@ +package router + +import ( + v1 "github.com/1Panel-dev/1Panel/core/app/api/v1" + "github.com/1Panel-dev/1Panel/core/middleware" + "github.com/gin-gonic/gin" +) + +type SettingRouter struct{} + +func (s *SettingRouter) InitRouter(Router *gin.RouterGroup) { + router := Router.Group("settings"). + Use(middleware.JwtAuth()). + Use(middleware.SessionAuth()) + settingRouter := Router.Group("settings"). + Use(middleware.JwtAuth()). + Use(middleware.SessionAuth()). + Use(middleware.PasswordExpired()) + baseApi := v1.ApiGroupApp.BaseApi + { + router.POST("/search", baseApi.GetSettingInfo) + router.POST("/expired/handle", baseApi.HandlePasswordExpired) + settingRouter.GET("/search/available", baseApi.GetSystemAvailable) + settingRouter.POST("/update", baseApi.UpdateSetting) + settingRouter.GET("/interface", baseApi.LoadInterfaceAddr) + settingRouter.POST("/menu/update", baseApi.UpdateMenu) + settingRouter.POST("/proxy/update", baseApi.UpdateProxy) + settingRouter.POST("/bind/update", baseApi.UpdateBindInfo) + settingRouter.POST("/port/update", baseApi.UpdatePort) + settingRouter.POST("/ssl/update", baseApi.UpdateSSL) + settingRouter.GET("/ssl/info", baseApi.LoadFromCert) + settingRouter.POST("/ssl/download", baseApi.DownloadSSL) + settingRouter.POST("/password/update", baseApi.UpdatePassword) + settingRouter.POST("/mfa", baseApi.LoadMFA) + settingRouter.POST("/mfa/bind", baseApi.MFABind) + + settingRouter.POST("/upgrade", baseApi.Upgrade) + settingRouter.POST("/upgrade/notes", baseApi.GetNotesByVersion) + settingRouter.GET("/upgrade", baseApi.GetUpgradeInfo) + settingRouter.GET("/basedir", baseApi.LoadBaseDir) + } +} diff --git a/core/server/init.go b/core/server/init.go new file mode 100644 index 000000000..b8ed30b47 --- /dev/null +++ b/core/server/init.go @@ -0,0 +1,6 @@ +//go:build !xpack + +package server + +func InitOthers() { +} diff --git a/core/server/server.go b/core/server/server.go new file mode 100644 index 000000000..c8a3166ce --- /dev/null +++ b/core/server/server.go @@ -0,0 +1,88 @@ +package server + +import ( + "crypto/tls" + "encoding/gob" + "fmt" + "net" + "net/http" + "os" + "path" + + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/i18n" + "github.com/1Panel-dev/1Panel/core/init/cache" + "github.com/1Panel-dev/1Panel/core/init/db" + "github.com/1Panel-dev/1Panel/core/init/hook" + "github.com/1Panel-dev/1Panel/core/init/log" + "github.com/1Panel-dev/1Panel/core/init/migration" + "github.com/1Panel-dev/1Panel/core/init/router" + "github.com/1Panel-dev/1Panel/core/init/session" + "github.com/1Panel-dev/1Panel/core/init/session/psession" + "github.com/1Panel-dev/1Panel/core/init/validator" + "github.com/1Panel-dev/1Panel/core/init/viper" + + "github.com/gin-gonic/gin" +) + +func Start() { + viper.Init() + i18n.Init() + log.Init() + db.Init() + migration.Init() + validator.Init() + gob.Register(psession.SessionUser{}) + cache.Init() + session.Init() + gin.SetMode("debug") + hook.Init() + + rootRouter := router.Routers() + + tcpItem := "tcp4" + if global.CONF.System.Ipv6 == "enable" { + tcpItem = "tcp" + global.CONF.System.BindAddress = fmt.Sprintf("[%s]", global.CONF.System.BindAddress) + } + server := &http.Server{ + Addr: global.CONF.System.BindAddress + ":" + global.CONF.System.Port, + Handler: rootRouter, + } + ln, err := net.Listen(tcpItem, server.Addr) + if err != nil { + panic(err) + } + type tcpKeepAliveListener struct { + *net.TCPListener + } + if global.CONF.System.SSL == "enable" { + certPath := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt") + keyPath := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.key") + certificate, err := os.ReadFile(certPath) + if err != nil { + panic(err) + } + key, err := os.ReadFile(keyPath) + if err != nil { + panic(err) + } + cert, err := tls.X509KeyPair(certificate, key) + if err != nil { + panic(err) + } + server.TLSConfig = &tls.Config{ + Certificates: []tls.Certificate{cert}, + } + global.LOG.Infof("listen at https://%s:%s [%s]", global.CONF.System.BindAddress, global.CONF.System.Port, tcpItem) + + if err := server.ServeTLS(tcpKeepAliveListener{ln.(*net.TCPListener)}, certPath, keyPath); err != nil { + panic(err) + } + } else { + global.LOG.Infof("listen at http://%s:%s [%s]", global.CONF.System.BindAddress, global.CONF.System.Port, tcpItem) + if err := server.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}); err != nil { + panic(err) + } + } +} diff --git a/core/utils/captcha/captcha.go b/core/utils/captcha/captcha.go new file mode 100644 index 000000000..c0a60bc01 --- /dev/null +++ b/core/utils/captcha/captcha.go @@ -0,0 +1,45 @@ +package captcha + +import ( + "strings" + + "github.com/1Panel-dev/1Panel/core/app/dto" + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/mojocn/base64Captcha" +) + +var store = base64Captcha.DefaultMemStore + +func VerifyCode(codeID string, code string) error { + if codeID == "" { + return constant.ErrCaptchaCode + } + vv := store.Get(codeID, true) + vv = strings.TrimSpace(vv) + code = strings.TrimSpace(code) + + if strings.EqualFold(vv, code) { + return nil + } + return constant.ErrCaptchaCode +} + +func CreateCaptcha() (*dto.CaptchaResponse, error) { + var driverString base64Captcha.DriverString + driverString.Source = "1234567890QWERTYUPLKJHGFDSAZXCVBNMqwertyupkjhgfdsazxcvbnm" + driverString.Width = 120 + driverString.Height = 50 + driverString.NoiseCount = 0 + driverString.Length = 4 + driverString.Fonts = []string{"RitaSmith.ttf", "actionj.ttf", "chromohv.ttf"} + driver := driverString.ConvertFonts() + c := base64Captcha.NewCaptcha(driver, store) + id, b64s, _, err := c.Generate() + if err != nil { + return nil, err + } + return &dto.CaptchaResponse{ + CaptchaID: id, + ImagePath: b64s, + }, nil +} diff --git a/core/utils/cmd/cmd.go b/core/utils/cmd/cmd.go new file mode 100644 index 000000000..264326bad --- /dev/null +++ b/core/utils/cmd/cmd.go @@ -0,0 +1,76 @@ +package cmd + +import ( + "bytes" + "fmt" + "os/exec" + "time" + + "github.com/1Panel-dev/1Panel/core/buserr" + "github.com/1Panel-dev/1Panel/core/constant" +) + +func Exec(cmdStr string) (string, error) { + return ExecWithTimeOut(cmdStr, 20*time.Second) +} + +func SudoHandleCmd() string { + cmd := exec.Command("sudo", "-n", "ls") + if err := cmd.Run(); err == nil { + return "sudo " + } + return "" +} + +func Execf(cmdStr string, a ...interface{}) (string, error) { + cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err := cmd.Run() + if err != nil { + return handleErr(stdout, stderr, err) + } + return stdout.String(), nil +} + +func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { + cmd := exec.Command("bash", "-c", cmdStr) + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + if err := cmd.Start(); err != nil { + return "", err + } + done := make(chan error, 1) + go func() { + done <- cmd.Wait() + }() + after := time.After(timeout) + select { + case <-after: + _ = cmd.Process.Kill() + return "", buserr.New(constant.ErrCmdTimeout) + case err := <-done: + if err != nil { + return handleErr(stdout, stderr, err) + } + } + + return stdout.String(), nil +} + +func handleErr(stdout, stderr bytes.Buffer, err error) (string, error) { + errMsg := "" + if len(stderr.String()) != 0 { + errMsg = fmt.Sprintf("stderr: %s", stderr.String()) + } + if len(stdout.String()) != 0 { + if len(errMsg) != 0 { + errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) + } else { + errMsg = fmt.Sprintf("stdout: %s", stdout.String()) + } + } + return errMsg, err +} diff --git a/core/utils/common/common.go b/core/utils/common/common.go new file mode 100644 index 000000000..99889d54b --- /dev/null +++ b/core/utils/common/common.go @@ -0,0 +1,96 @@ +package common + +import ( + mathRand "math/rand" + "net" + "strconv" + "strings" + "time" +) + +var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") + +func RandStr(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letters[mathRand.Intn(len(letters))] + } + return string(b) +} +func RandStrAndNum(n int) string { + source := mathRand.NewSource(time.Now().UnixNano()) + randGen := mathRand.New(source) + const charset = "abcdefghijklmnopqrstuvwxyz0123456789" + b := make([]byte, n) + for i := range b { + b[i] = charset[randGen.Intn(len(charset)-1)] + } + return (string(b)) +} + +func LoadTimeZone() string { + loc := time.Now().Location() + if _, err := time.LoadLocation(loc.String()); err != nil { + return "Asia/Shanghai" + } + return loc.String() +} + +func ScanPort(port int) bool { + ln, err := net.Listen("tcp", ":"+strconv.Itoa(port)) + if err != nil { + return true + } + defer ln.Close() + return false +} + +func ComparePanelVersion(version1, version2 string) bool { + if version1 == version2 { + return false + } + version1s := SplitStr(version1, ".", "-") + version2s := SplitStr(version2, ".", "-") + + if len(version2s) > len(version1s) { + for i := 0; i < len(version2s)-len(version1s); i++ { + version1s = append(version1s, "0") + } + } + if len(version1s) > len(version2s) { + for i := 0; i < len(version1s)-len(version2s); i++ { + version2s = append(version2s, "0") + } + } + + n := min(len(version1s), len(version2s)) + for i := 0; i < n; i++ { + if version1s[i] == version2s[i] { + continue + } else { + v1, err1 := strconv.Atoi(version1s[i]) + if err1 != nil { + return version1s[i] > version2s[i] + } + v2, err2 := strconv.Atoi(version2s[i]) + if err2 != nil { + return version1s[i] > version2s[i] + } + return v1 > v2 + } + } + return true +} + +func SplitStr(str string, spi ...string) []string { + lists := []string{str} + var results []string + for _, s := range spi { + results = []string{} + for _, list := range lists { + results = append(results, strings.Split(list, s)...) + } + lists = results + } + return results +} diff --git a/core/utils/copier/copier.go b/core/utils/copier/copier.go new file mode 100644 index 000000000..bfc684ce9 --- /dev/null +++ b/core/utils/copier/copier.go @@ -0,0 +1,18 @@ +package copier + +import ( + "encoding/json" + + "github.com/pkg/errors" +) + +func Copy(to, from interface{}) error { + b, err := json.Marshal(from) + if err != nil { + return errors.Wrap(err, "marshal from data err") + } + if err = json.Unmarshal(b, to); err != nil { + return errors.Wrap(err, "unmarshal to data err") + } + return nil +} diff --git a/core/utils/encrypt/encrypt.go b/core/utils/encrypt/encrypt.go new file mode 100644 index 000000000..d772eaabf --- /dev/null +++ b/core/utils/encrypt/encrypt.go @@ -0,0 +1,104 @@ +package encrypt + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" + "fmt" + "io" + + "github.com/1Panel-dev/1Panel/core/app/model" + "github.com/1Panel-dev/1Panel/core/global" +) + +func StringEncrypt(text string) (string, error) { + if len(text) == 0 { + return "", nil + } + if len(global.CONF.System.EncryptKey) == 0 { + var encryptSetting model.Setting + if err := global.DB.Where("key = ?", "EncryptKey").First(&encryptSetting).Error; err != nil { + return "", err + } + global.CONF.System.EncryptKey = encryptSetting.Value + } + key := global.CONF.System.EncryptKey + pass := []byte(text) + xpass, err := aesEncryptWithSalt([]byte(key), pass) + if err == nil { + pass64 := base64.StdEncoding.EncodeToString(xpass) + return pass64, err + } + return "", err +} + +func StringDecrypt(text string) (string, error) { + if len(text) == 0 { + return "", nil + } + if len(global.CONF.System.EncryptKey) == 0 { + var encryptSetting model.Setting + if err := global.DB.Where("key = ?", "EncryptKey").First(&encryptSetting).Error; err != nil { + return "", err + } + global.CONF.System.EncryptKey = encryptSetting.Value + } + key := global.CONF.System.EncryptKey + bytesPass, err := base64.StdEncoding.DecodeString(text) + if err != nil { + return "", err + } + var tpass []byte + tpass, err = aesDecryptWithSalt([]byte(key), bytesPass) + if err == nil { + result := string(tpass[:]) + return result, err + } + return "", err +} + +func padding(plaintext []byte, blockSize int) []byte { + padding := blockSize - len(plaintext)%blockSize + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + return append(plaintext, padtext...) +} + +func unPadding(origData []byte) []byte { + length := len(origData) + unpadding := int(origData[length-1]) + return origData[:(length - unpadding)] +} + +func aesEncryptWithSalt(key, plaintext []byte) ([]byte, error) { + plaintext = padding(plaintext, aes.BlockSize) + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + ciphertext := make([]byte, aes.BlockSize+len(plaintext)) + iv := ciphertext[0:aes.BlockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + return nil, err + } + cbc := cipher.NewCBCEncrypter(block, iv) + cbc.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) + return ciphertext, nil +} +func aesDecryptWithSalt(key, ciphertext []byte) ([]byte, error) { + var block cipher.Block + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + if len(ciphertext) < aes.BlockSize { + return nil, fmt.Errorf("iciphertext too short") + } + iv := ciphertext[:aes.BlockSize] + ciphertext = ciphertext[aes.BlockSize:] + cbc := cipher.NewCBCDecrypter(block, iv) + cbc.CryptBlocks(ciphertext, ciphertext) + ciphertext = unPadding(ciphertext) + return ciphertext, nil +} diff --git a/core/utils/files/files.go b/core/utils/files/files.go new file mode 100644 index 000000000..79e03a843 --- /dev/null +++ b/core/utils/files/files.go @@ -0,0 +1,139 @@ +package files + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/http" + "os" + "path" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/constant" + "github.com/1Panel-dev/1Panel/core/global" + "github.com/1Panel-dev/1Panel/core/utils/cmd" + httpUtil "github.com/1Panel-dev/1Panel/core/utils/http" +) + +func CopyFile(src, dst string) error { + source, err := os.Open(src) + if err != nil { + return err + } + defer source.Close() + + if path.Base(src) != path.Base(dst) { + dst = path.Join(dst, path.Base(src)) + } + if _, err := os.Stat(path.Dir(dst)); err != nil { + if os.IsNotExist(err) { + _ = os.MkdirAll(path.Dir(dst), os.ModePerm) + } + } + target, err := os.OpenFile(dst+"_temp", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) + if err != nil { + return err + } + defer target.Close() + + if _, err = io.Copy(target, source); err != nil { + return err + } + if err = os.Rename(dst+"_temp", dst); err != nil { + return err + } + return nil +} + +func HandleTar(sourceDir, targetDir, name, exclusionRules string, secret string) error { + if _, err := os.Stat(targetDir); err != nil && os.IsNotExist(err) { + if err = os.MkdirAll(targetDir, os.ModePerm); err != nil { + return err + } + } + + excludes := strings.Split(exclusionRules, ",") + excludeRules := "" + excludes = append(excludes, "*.sock") + for _, exclude := range excludes { + if len(exclude) == 0 { + continue + } + excludeRules += " --exclude " + exclude + } + path := "" + if strings.Contains(sourceDir, "/") { + itemDir := strings.ReplaceAll(sourceDir[strings.LastIndex(sourceDir, "/"):], "/", "") + aheadDir := sourceDir[:strings.LastIndex(sourceDir, "/")] + if len(aheadDir) == 0 { + aheadDir = "/" + } + path += fmt.Sprintf("-C %s %s", aheadDir, itemDir) + } else { + path = sourceDir + } + + commands := "" + + if len(secret) != 0 { + extraCmd := "| openssl enc -aes-256-cbc -salt -k '" + secret + "' -out" + commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read -zcf %s %s %s %s", " -"+excludeRules, path, extraCmd, targetDir+"/"+name) + global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******")) + } else { + commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read -zcf %s %s %s", targetDir+"/"+name, excludeRules, path) + global.LOG.Debug(commands) + } + stdout, err := cmd.ExecWithTimeOut(commands, 24*time.Hour) + if err != nil { + if len(stdout) != 0 { + global.LOG.Errorf("do handle tar failed, stdout: %s, err: %v", stdout, err) + return fmt.Errorf("do handle tar failed, stdout: %s, err: %v", stdout, err) + } + } + return nil +} + +func HandleUnTar(sourceFile, targetDir string, secret string) error { + if _, err := os.Stat(targetDir); err != nil && os.IsNotExist(err) { + if err = os.MkdirAll(targetDir, os.ModePerm); err != nil { + return err + } + } + commands := "" + if len(secret) != 0 { + extraCmd := "openssl enc -d -aes-256-cbc -k '" + secret + "' -in " + sourceFile + " | " + commands = fmt.Sprintf("%s tar -zxvf - -C %s", extraCmd, targetDir+" > /dev/null 2>&1") + global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******")) + } else { + commands = fmt.Sprintf("tar zxvfC %s %s", sourceFile, targetDir) + global.LOG.Debug(commands) + } + + stdout, err := cmd.ExecWithTimeOut(commands, 24*time.Hour) + if err != nil { + global.LOG.Errorf("do handle untar failed, stdout: %s, err: %v", stdout, err) + return errors.New(stdout) + } + return nil +} + +func DownloadFileWithProxy(url, dst string) error { + _, resp, err := httpUtil.HandleGet(url, http.MethodGet, constant.TimeOut5m) + if err != nil { + return err + } + + out, err := os.Create(dst) + if err != nil { + return fmt.Errorf("create download file [%s] error, err %s", dst, err.Error()) + } + defer out.Close() + + reader := bytes.NewReader(resp) + if _, err = io.Copy(out, reader); err != nil { + return fmt.Errorf("save download file [%s] error, err %s", dst, err.Error()) + } + return nil +} diff --git a/core/utils/http/http.go b/core/utils/http/http.go new file mode 100644 index 000000000..5ceded012 --- /dev/null +++ b/core/utils/http/http.go @@ -0,0 +1,97 @@ +package http + +import ( + "context" + "crypto/tls" + "errors" + "io" + "net" + "net/http" + "strings" + "time" + + "github.com/1Panel-dev/1Panel/core/buserr" + "github.com/1Panel-dev/1Panel/core/global" +) + +func HandleGet(url, method string, timeout int) (int, []byte, error) { + transport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + DialContext: (&net.Dialer{ + Timeout: 60 * time.Second, + KeepAlive: 60 * time.Second, + }).DialContext, + TLSHandshakeTimeout: 5 * time.Second, + ResponseHeaderTimeout: 10 * time.Second, + IdleConnTimeout: 15 * time.Second, + } + return HandleGetWithTransport(url, method, transport, timeout) +} + +func HandleGetWithTransport(url, method string, transport *http.Transport, timeout int) (int, []byte, error) { + defer func() { + if r := recover(); r != nil { + global.LOG.Errorf("handle request failed, error message: %v", r) + return + } + }() + + client := http.Client{Timeout: time.Duration(timeout) * time.Second, Transport: transport} + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second) + defer cancel() + request, err := http.NewRequestWithContext(ctx, method, url, nil) + if err != nil { + return 0, nil, err + } + request.Header.Set("Content-Type", "application/json") + resp, err := client.Do(request) + if err != nil { + return 0, nil, err + } + body, err := io.ReadAll(resp.Body) + if err != nil { + return 0, nil, err + } + defer resp.Body.Close() + + return resp.StatusCode, body, nil +} + +func GetHttpRes(url string) (*http.Response, error) { + client := &http.Client{ + Timeout: time.Second * 300, + } + transport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + DialContext: (&net.Dialer{ + Timeout: 60 * time.Second, + KeepAlive: 60 * time.Second, + }).DialContext, + TLSHandshakeTimeout: 5 * time.Second, + ResponseHeaderTimeout: 10 * time.Second, + IdleConnTimeout: 15 * time.Second, + } + client.Transport = transport + + req, err := http.NewRequestWithContext(context.Background(), "GET", url, nil) + if err != nil { + return nil, buserr.WithMap("ErrCreateHttpClient", map[string]interface{}{"err": err.Error()}, err) + } + + resp, err := client.Do(req) + if err != nil { + if errors.Is(err, context.DeadlineExceeded) { + return nil, buserr.WithMap("ErrHttpReqTimeOut", map[string]interface{}{"err": err.Error()}, err) + } else { + if strings.Contains(err.Error(), "no such host") { + return nil, buserr.New("ErrNoSuchHost") + } + return nil, buserr.WithMap("ErrHttpReqFailed", map[string]interface{}{"err": err.Error()}, err) + } + } + if resp.StatusCode == 404 { + return nil, buserr.New("ErrHttpReqNotFound") + } + + return resp, nil +} diff --git a/core/utils/jwt/jwt.go b/core/utils/jwt/jwt.go new file mode 100644 index 000000000..629d5e6bb --- /dev/null +++ b/core/utils/jwt/jwt.go @@ -0,0 +1,69 @@ +package jwt + +import ( + "time" + + "github.com/1Panel-dev/1Panel/core/app/repo" + "github.com/1Panel-dev/1Panel/core/constant" + + "github.com/golang-jwt/jwt/v4" +) + +type JWT struct { + SigningKey []byte +} + +type JwtRequest struct { + BaseClaims + BufferTime int64 + jwt.RegisteredClaims +} + +type CustomClaims struct { + BaseClaims + BufferTime int64 + jwt.RegisteredClaims +} + +type BaseClaims struct { + ID uint + Name string +} + +func NewJWT() *JWT { + settingRepo := repo.NewISettingRepo() + jwtSign, _ := settingRepo.Get(settingRepo.WithByKey("JWTSigningKey")) + return &JWT{ + []byte(jwtSign.Value), + } +} + +func (j *JWT) CreateClaims(baseClaims BaseClaims) CustomClaims { + claims := CustomClaims{ + BaseClaims: baseClaims, + BufferTime: constant.JWTBufferTime, + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Second * time.Duration(constant.JWTBufferTime))), + Issuer: constant.JWTIssuer, + }, + } + return claims +} + +func (j *JWT) CreateToken(request CustomClaims) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, &request) + return token.SignedString(j.SigningKey) +} + +func (j *JWT) ParseToken(tokenStr string) (*JwtRequest, error) { + token, err := jwt.ParseWithClaims(tokenStr, &JwtRequest{}, func(token *jwt.Token) (interface{}, error) { + return j.SigningKey, nil + }) + if err != nil || token == nil { + return nil, constant.ErrTokenParse + } + if claims, ok := token.Claims.(*JwtRequest); ok && token.Valid { + return claims, nil + } + return nil, constant.ErrTokenParse +} diff --git a/core/utils/mfa/mfa.go b/core/utils/mfa/mfa.go new file mode 100644 index 000000000..458911c31 --- /dev/null +++ b/core/utils/mfa/mfa.go @@ -0,0 +1,46 @@ +package mfa + +import ( + "bytes" + "encoding/base64" + "strconv" + "time" + + "github.com/1Panel-dev/1Panel/core/global" + "github.com/skip2/go-qrcode" + "github.com/xlzd/gotp" +) + +const secretLength = 16 + +type Otp struct { + Secret string `json:"secret"` + QrImage string `json:"qrImage"` +} + +func GetOtp(username, title string, interval int) (otp Otp, err error) { + secret := gotp.RandomSecret(secretLength) + otp.Secret = secret + totp := gotp.NewTOTP(secret, 6, interval, nil) + uri := totp.ProvisioningUri(username, title) + subImg, err := qrcode.Encode(uri, qrcode.Medium, 256) + dist := make([]byte, 3000) + base64.StdEncoding.Encode(dist, subImg) + index := bytes.IndexByte(dist, 0) + baseImage := dist[0:index] + otp.QrImage = "data:image/png;base64," + string(baseImage) + return +} + +func ValidCode(code, intervalStr, secret string) bool { + interval, err := strconv.Atoi(intervalStr) + if err != nil { + global.LOG.Errorf("type conversion failed, err: %v", err) + return false + } + totp := gotp.NewTOTP(secret, 6, interval, nil) + now := time.Now().Unix() + strInt64 := strconv.FormatInt(now, 10) + id16, _ := strconv.Atoi(strInt64) + return totp.Verify(code, int64(id16)) +}