mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-01-19 08:19:15 +08:00
feat(website): Add Cache Clearing Functionality for Website Reverse P… (#7551)
This commit is contained in:
parent
542512fc58
commit
b719383943
@ -101,21 +101,6 @@ func (b *BaseApi) UpdateNginxFile(c *gin.Context) {
|
|||||||
helper.SuccessWithData(c, nil)
|
helper.SuccessWithData(c, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Tags OpenResty
|
|
||||||
// @Summary Clear OpenResty proxy cache
|
|
||||||
// @Description 清理 OpenResty 代理缓存
|
|
||||||
// @Success 200
|
|
||||||
// @Security ApiKeyAuth
|
|
||||||
// @Router /openresty/clear [post]
|
|
||||||
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理 Openresty 代理缓存","formatEN":"Clear nginx proxy cache"}
|
|
||||||
func (b *BaseApi) ClearNginxProxyCache(c *gin.Context) {
|
|
||||||
if err := nginxService.ClearProxyCache(); err != nil {
|
|
||||||
helper.InternalServer(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
helper.SuccessWithOutData(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Tags OpenResty
|
// @Tags OpenResty
|
||||||
// @Summary Build OpenResty
|
// @Summary Build OpenResty
|
||||||
// @Description 构建 OpenResty
|
// @Description 构建 OpenResty
|
||||||
|
@ -1082,3 +1082,21 @@ func (b *BaseApi) ListCustomRewrite(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.SuccessWithData(c, res)
|
helper.SuccessWithData(c, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Tags Website
|
||||||
|
// @Summary Clear Website proxy cache
|
||||||
|
// @Success 200
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Router /websites/proxy/clear [post]
|
||||||
|
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理 Openresty 代理缓存","formatEN":"Clear nginx proxy cache"}
|
||||||
|
func (b *BaseApi) ClearProxyCache(c *gin.Context) {
|
||||||
|
var req request.NginxCommonReq
|
||||||
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := websiteService.ClearProxyCache(req); err != nil {
|
||||||
|
helper.InternalServer(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithOutData(c)
|
||||||
|
}
|
||||||
|
@ -35,7 +35,6 @@ type INginxService interface {
|
|||||||
UpdateConfigByScope(req request.NginxConfigUpdate) error
|
UpdateConfigByScope(req request.NginxConfigUpdate) error
|
||||||
GetStatus() (response.NginxStatus, error)
|
GetStatus() (response.NginxStatus, error)
|
||||||
UpdateConfigFile(req request.NginxConfigFileUpdate) error
|
UpdateConfigFile(req request.NginxConfigFileUpdate) error
|
||||||
ClearProxyCache() error
|
|
||||||
|
|
||||||
Build(req request.NginxBuildReq) error
|
Build(req request.NginxBuildReq) error
|
||||||
GetModules() (*response.NginxBuildConfig, error)
|
GetModules() (*response.NginxBuildConfig, error)
|
||||||
@ -166,25 +165,6 @@ func (n NginxService) UpdateConfigFile(req request.NginxConfigFileUpdate) error
|
|||||||
return nginxCheckAndReload(string(oldContent), filePath, nginxInstall.ContainerName)
|
return nginxCheckAndReload(string(oldContent), filePath, nginxInstall.ContainerName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n NginxService) ClearProxyCache() error {
|
|
||||||
nginxInstall, err := getAppInstallByKey(constant.AppOpenresty)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cacheDir := path.Join(nginxInstall.GetPath(), "www/common/proxy/proxy_cache_dir")
|
|
||||||
fileOp := files.NewFileOp()
|
|
||||||
if fileOp.Stat(cacheDir) {
|
|
||||||
if err = fileOp.CleanDir(cacheDir); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = compose.Restart(nginxInstall.GetComposePath())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n NginxService) Build(req request.NginxBuildReq) error {
|
func (n NginxService) Build(req request.NginxBuildReq) error {
|
||||||
nginxInstall, err := getAppInstallByKey(constant.AppOpenresty)
|
nginxInstall, err := getAppInstallByKey(constant.AppOpenresty)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -91,6 +91,7 @@ type IWebsiteService interface {
|
|||||||
UpdateProxyFile(req request.NginxProxyUpdate) (err error)
|
UpdateProxyFile(req request.NginxProxyUpdate) (err error)
|
||||||
UpdateProxyCache(req request.NginxProxyCacheUpdate) (err error)
|
UpdateProxyCache(req request.NginxProxyCacheUpdate) (err error)
|
||||||
GetProxyCache(id uint) (res response.NginxProxyCache, err error)
|
GetProxyCache(id uint) (res response.NginxProxyCache, err error)
|
||||||
|
ClearProxyCache(req request.NginxCommonReq) error
|
||||||
|
|
||||||
GetAntiLeech(id uint) (*response.NginxAntiLeechRes, error)
|
GetAntiLeech(id uint) (*response.NginxAntiLeechRes, error)
|
||||||
UpdateAntiLeech(req request.NginxAntiLeechUpdate) (err error)
|
UpdateAntiLeech(req request.NginxAntiLeechUpdate) (err error)
|
||||||
@ -1822,6 +1823,28 @@ func (w WebsiteService) UpdateProxyFile(req request.NginxProxyUpdate) (err error
|
|||||||
return updateNginxConfig(constant.NginxScopeServer, nil, &website)
|
return updateNginxConfig(constant.NginxScopeServer, nil, &website)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w WebsiteService) ClearProxyCache(req request.NginxCommonReq) error {
|
||||||
|
website, err := websiteRepo.GetFirst(commonRepo.WithByID(req.WebsiteID))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cacheDir := GetSitePath(website, SiteProxyDir)
|
||||||
|
fileOp := files.NewFileOp()
|
||||||
|
if fileOp.Stat(cacheDir) {
|
||||||
|
if err = fileOp.CleanDir(cacheDir); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nginxInstall, err := getAppInstallByKey(constant.AppOpenresty)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = opNginx(nginxInstall.ContainerName, constant.NginxReload); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (w WebsiteService) GetAuthBasics(req request.NginxAuthReq) (res response.NginxAuthRes, err error) {
|
func (w WebsiteService) GetAuthBasics(req request.NginxAuthReq) (res response.NginxAuthRes, err error) {
|
||||||
var (
|
var (
|
||||||
website model.Website
|
website model.Website
|
||||||
|
@ -18,7 +18,6 @@ func (a *NginxRouter) InitRouter(Router *gin.RouterGroup) {
|
|||||||
groupRouter.POST("/update", baseApi.UpdateNginxConfigByScope)
|
groupRouter.POST("/update", baseApi.UpdateNginxConfigByScope)
|
||||||
groupRouter.GET("/status", baseApi.GetNginxStatus)
|
groupRouter.GET("/status", baseApi.GetNginxStatus)
|
||||||
groupRouter.POST("/file", baseApi.UpdateNginxFile)
|
groupRouter.POST("/file", baseApi.UpdateNginxFile)
|
||||||
groupRouter.POST("/clear", baseApi.ClearNginxProxyCache)
|
|
||||||
groupRouter.POST("/build", baseApi.BuildNginx)
|
groupRouter.POST("/build", baseApi.BuildNginx)
|
||||||
groupRouter.POST("/modules/update", baseApi.UpdateNginxModule)
|
groupRouter.POST("/modules/update", baseApi.UpdateNginxModule)
|
||||||
groupRouter.GET("/modules", baseApi.GetNginxModules)
|
groupRouter.GET("/modules", baseApi.GetNginxModules)
|
||||||
|
@ -53,6 +53,7 @@ func (a *WebsiteRouter) InitRouter(Router *gin.RouterGroup) {
|
|||||||
websiteRouter.POST("/proxies/file", baseApi.UpdateProxyConfigFile)
|
websiteRouter.POST("/proxies/file", baseApi.UpdateProxyConfigFile)
|
||||||
websiteRouter.POST("/proxy/config", baseApi.UpdateProxyCache)
|
websiteRouter.POST("/proxy/config", baseApi.UpdateProxyCache)
|
||||||
websiteRouter.GET("/proxy/config/:id", baseApi.GetProxyCache)
|
websiteRouter.GET("/proxy/config/:id", baseApi.GetProxyCache)
|
||||||
|
websiteRouter.POST("/proxy/clear", baseApi.ClearProxyCache)
|
||||||
|
|
||||||
websiteRouter.POST("/auths", baseApi.GetAuthConfig)
|
websiteRouter.POST("/auths", baseApi.GetAuthConfig)
|
||||||
websiteRouter.POST("/auths/update", baseApi.UpdateAuthConfig)
|
websiteRouter.POST("/auths/update", baseApi.UpdateAuthConfig)
|
||||||
|
@ -22,10 +22,6 @@ export const UpdateNginxConfigFile = (req: Nginx.NginxFileUpdate) => {
|
|||||||
return http.post(`/openresty/file`, req);
|
return http.post(`/openresty/file`, req);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ClearNginxCache = () => {
|
|
||||||
return http.post(`/openresty/clear`);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const BuildNginx = (req: Nginx.NginxBuildReq) => {
|
export const BuildNginx = (req: Nginx.NginxBuildReq) => {
|
||||||
return http.post(`/openresty/build`, req);
|
return http.post(`/openresty/build`, req);
|
||||||
};
|
};
|
||||||
|
@ -190,6 +190,10 @@ export const UpdateProxyConfigFile = (req: Website.ProxyFileUpdate) => {
|
|||||||
return http.post<any>(`/websites/proxies/file`, req);
|
return http.post<any>(`/websites/proxies/file`, req);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const ClearProxtCache = (req: Website.WebsiteReq) => {
|
||||||
|
return http.post(`/websites/proxy/clear`, req);
|
||||||
|
};
|
||||||
|
|
||||||
export const GetAuthConfig = (req: Website.AuthReq) => {
|
export const GetAuthConfig = (req: Website.AuthReq) => {
|
||||||
return http.post<Website.AuthConfig>(`/websites/auths`, req);
|
return http.post<Website.AuthConfig>(`/websites/auths`, req);
|
||||||
};
|
};
|
||||||
|
@ -51,18 +51,6 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.set') }}
|
{{ $t('commons.button.set') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-divider v-if="data.app === 'OpenResty'" direction="vertical" />
|
|
||||||
<el-button
|
|
||||||
v-if="data.app === 'OpenResty'"
|
|
||||||
type="primary"
|
|
||||||
@click="clear"
|
|
||||||
link
|
|
||||||
:disabled="
|
|
||||||
data.status === 'Installing' || (data.status !== 'Running' && data.app === 'OpenResty')
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ $t('nginx.clearProxyCache') }}
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-5" v-if="key === 'openresty' && (httpPort != 80 || httpsPort != 443)">
|
<div class="ml-5" v-if="key === 'openresty' && (httpPort != 80 || httpsPort != 443)">
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
@ -91,7 +79,6 @@ import Status from '@/components/status/index.vue';
|
|||||||
import { ElMessageBox } from 'element-plus';
|
import { ElMessageBox } from 'element-plus';
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
import { MsgSuccess } from '@/utils/message';
|
import { MsgSuccess } from '@/utils/message';
|
||||||
import { ClearNginxCache } from '@/api/modules/nginx';
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
appKey: {
|
appKey: {
|
||||||
@ -146,16 +133,6 @@ const onCheck = async (key: any, name: any) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const clear = () => {
|
|
||||||
ElMessageBox.confirm(i18n.global.t('nginx.clearProxyCacheWarn'), i18n.global.t('nginx.clearProxyCache'), {
|
|
||||||
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
|
||||||
cancelButtonText: i18n.global.t('commons.button.cancel'),
|
|
||||||
}).then(async () => {
|
|
||||||
await ClearNginxCache();
|
|
||||||
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const onOperate = async (operation: string) => {
|
const onOperate = async (operation: string) => {
|
||||||
em('update:maskShow', false);
|
em('update:maskShow', false);
|
||||||
operateReq.operate = operation;
|
operateReq.operate = operation;
|
||||||
|
@ -2364,8 +2364,7 @@ const message = {
|
|||||||
configResource: 'Configuration',
|
configResource: 'Configuration',
|
||||||
saveAndReload: 'Save and Reload',
|
saveAndReload: 'Save and Reload',
|
||||||
clearProxyCache: 'Clear reverse proxy cache',
|
clearProxyCache: 'Clear reverse proxy cache',
|
||||||
clearProxyCacheWarn:
|
clearProxyCacheWarn: 'This action will delete all files in the cache directory. Do you want to continue?',
|
||||||
'Clearing the reverse proxy cache will affect all websites configured with cache and requires restarting OpenResty. Do you want to continue? ',
|
|
||||||
create: 'Add a new module',
|
create: 'Add a new module',
|
||||||
update: 'Edit a module',
|
update: 'Edit a module',
|
||||||
params: 'Parameters',
|
params: 'Parameters',
|
||||||
|
@ -2203,7 +2203,7 @@ const message = {
|
|||||||
configResource: '配置修改',
|
configResource: '配置修改',
|
||||||
saveAndReload: '保存並重載',
|
saveAndReload: '保存並重載',
|
||||||
clearProxyCache: '清除反代快取',
|
clearProxyCache: '清除反代快取',
|
||||||
clearProxyCacheWarn: '清除反代快取會影響所有配置快取的網站,並且需要重新啟動 OpenResty, 是否繼續? ',
|
clearProxyCacheWarn: '此操作將刪除緩存目錄下的所有文件,是否繼續?',
|
||||||
create: '新增模組',
|
create: '新增模組',
|
||||||
update: '編輯模組',
|
update: '編輯模組',
|
||||||
params: '參數',
|
params: '參數',
|
||||||
|
@ -2202,7 +2202,7 @@ const message = {
|
|||||||
configResource: '配置修改',
|
configResource: '配置修改',
|
||||||
saveAndReload: '保存并重载',
|
saveAndReload: '保存并重载',
|
||||||
clearProxyCache: '清除反代缓存',
|
clearProxyCache: '清除反代缓存',
|
||||||
clearProxyCacheWarn: '清除反代缓存会影响所有配置缓存的网站,并且需要重启 OpenResty, 是否继续?',
|
clearProxyCacheWarn: '此操作将删除缓存目录下的所有文件, 是否继续?',
|
||||||
create: '新增模块',
|
create: '新增模块',
|
||||||
update: '编辑模块',
|
update: '编辑模块',
|
||||||
params: '参数',
|
params: '参数',
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
<template #toolbar>
|
<template #toolbar>
|
||||||
<el-button type="primary" plain @click="openCreate">{{ $t('commons.button.create') }}</el-button>
|
<el-button type="primary" plain @click="openCreate">{{ $t('commons.button.create') }}</el-button>
|
||||||
<el-button @click="openCache">{{ $t('website.proxyCache') }}</el-button>
|
<el-button @click="openCache">{{ $t('website.proxyCache') }}</el-button>
|
||||||
|
<el-button type="primary" @click="clear" link>
|
||||||
|
{{ $t('nginx.clearProxyCache') }}
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
<el-table-column :label="$t('commons.table.name')" prop="name"></el-table-column>
|
<el-table-column :label="$t('commons.table.name')" prop="name"></el-table-column>
|
||||||
<el-table-column :label="$t('website.proxyPath')" prop="match"></el-table-column>
|
<el-table-column :label="$t('website.proxyPath')" prop="match"></el-table-column>
|
||||||
@ -35,7 +38,7 @@
|
|||||||
|
|
||||||
<script lang="ts" setup name="proxy">
|
<script lang="ts" setup name="proxy">
|
||||||
import { Website } from '@/api/interface/website';
|
import { Website } from '@/api/interface/website';
|
||||||
import { OperateProxyConfig, GetProxyConfig } from '@/api/modules/website';
|
import { OperateProxyConfig, GetProxyConfig, ClearProxtCache } from '@/api/modules/website';
|
||||||
import { computed, onMounted, ref } from 'vue';
|
import { computed, onMounted, ref } from 'vue';
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
import { MsgSuccess } from '@/utils/message';
|
import { MsgSuccess } from '@/utils/message';
|
||||||
@ -198,6 +201,16 @@ const search = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const clear = () => {
|
||||||
|
ElMessageBox.confirm(i18n.global.t('nginx.clearProxyCacheWarn'), i18n.global.t('nginx.clearProxyCache'), {
|
||||||
|
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
||||||
|
cancelButtonText: i18n.global.t('commons.button.cancel'),
|
||||||
|
}).then(async () => {
|
||||||
|
await ClearProxtCache({ websiteID: id.value });
|
||||||
|
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
search();
|
search();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user