diff --git a/backend/app/api/v1/website.go b/backend/app/api/v1/website.go index 6bee070aa..5c7089523 100644 --- a/backend/app/api/v1/website.go +++ b/backend/app/api/v1/website.go @@ -626,3 +626,25 @@ func (b *BaseApi) UpdateSiteDir(c *gin.Context) { } helper.SuccessWithOutData(c) } + +// @Tags Website +// @Summary Update Site Dir permission +// @Description 更新网站目录权限 +// @Accept json +// @Param request body request.WebsiteUpdateDirPermission true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /websites/dir/permission [post] +// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFuntions":[{"input_colume":"id","input_value":"id","isList":false,"db":"websites","output_colume":"primary_domain","output_value":"domain"}],"formatZH":"更新网站 [domain] 目录权限","formatEN":"Update domain [domain] dir permission"} +func (b *BaseApi) UpdateSiteDirPermission(c *gin.Context) { + var req request.WebsiteUpdateDirPermission + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + if err := websiteService.UpdateSitePermission(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithOutData(c) +} diff --git a/backend/app/dto/request/website.go b/backend/app/dto/request/website.go index 35445acbf..9e7b4f4a1 100644 --- a/backend/app/dto/request/website.go +++ b/backend/app/dto/request/website.go @@ -150,3 +150,9 @@ type WebsiteUpdateDir struct { ID uint `json:"id" validate:"required"` SiteDir string `json:"siteDir" validate:"required"` } + +type WebsiteUpdateDirPermission struct { + ID uint `json:"id" validate:"required"` + User string `json:"user" validate:"required"` + Group string `json:"group" validate:"required"` +} diff --git a/backend/app/model/website.go b/backend/app/model/website.go index 834b36ffe..08d2754c4 100644 --- a/backend/app/model/website.go +++ b/backend/app/model/website.go @@ -26,6 +26,9 @@ type Website struct { RuntimeID uint `gorm:"type:integer" json:"runtimeID"` AppInstallID uint `gorm:"type:integer" json:"appInstallId"` + User string `gorm:"type:varchar;" json:"user"` + Group string `gorm:"type:varchar;" json:"group"` + Domains []WebsiteDomain `json:"domains" gorm:"-:migration"` WebsiteSSL WebsiteSSL `json:"webSiteSSL" gorm:"-:migration"` } diff --git a/backend/app/service/website.go b/backend/app/service/website.go index f19e046c2..7f559e8be 100644 --- a/backend/app/service/website.go +++ b/backend/app/service/website.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "github.com/1Panel-dev/1Panel/backend/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/cmd/server/nginx_conf" "gorm.io/gorm" "os" @@ -62,6 +63,7 @@ type IWebsiteService interface { GetRewriteConfig(req request.NginxRewriteReq) (*response.NginxRewriteRes, error) UpdateRewriteConfig(req request.NginxRewriteUpdate) error UpdateSiteDir(req request.WebsiteUpdateDir) error + UpdateSitePermission(req request.WebsiteUpdateDirPermission) error } func NewIWebsiteService() IWebsiteService { @@ -1075,3 +1077,25 @@ func (w WebsiteService) UpdateSiteDir(req request.WebsiteUpdateDir) error { website.SiteDir = runDir return websiteRepo.Save(context.Background(), &website) } + +func (w WebsiteService) UpdateSitePermission(req request.WebsiteUpdateDirPermission) error { + website, err := websiteRepo.GetFirst(commonRepo.WithByID(req.ID)) + if err != nil { + return err + } + nginxInstall, err := getAppInstallByKey(constant.AppOpenresty) + if err != nil { + return err + } + absoluteIndexPath := path.Join(nginxInstall.GetPath(), "www", "sites", website.PrimaryDomain, "index") + if website.SiteDir != "/" { + absoluteIndexPath = path.Join(absoluteIndexPath, website.SiteDir) + } + chownCmd := fmt.Sprintf("chown -R %s:%s %s", req.User, req.Group, absoluteIndexPath) + if _, err := cmd.ExecWithTimeOut(chownCmd, 1*time.Second); err != nil { + return err + } + website.User = req.User + website.Group = req.Group + return websiteRepo.Save(context.Background(), &website) +} diff --git a/backend/init/migration/migrations/init.go b/backend/init/migration/migrations/init.go index e24376f9a..bf934a602 100644 --- a/backend/init/migration/migrations/init.go +++ b/backend/init/migration/migrations/init.go @@ -276,7 +276,7 @@ var UpdateTableHost = &gormigrate.Migration{ } var UpdateTableWebsite = &gormigrate.Migration{ - ID: "20230417-update-table-website", + ID: "20230418-update-table-website", Migrate: func(tx *gorm.DB) error { if err := tx.AutoMigrate(&model.Website{}); err != nil { return err diff --git a/backend/router/ro_website.go b/backend/router/ro_website.go index 38a217575..0bdb73f47 100644 --- a/backend/router/ro_website.go +++ b/backend/router/ro_website.go @@ -50,5 +50,6 @@ func (a *WebsiteRouter) InitWebsiteRouter(Router *gin.RouterGroup) { groupRouter.POST("/rewrite/update", baseApi.UpdateRewriteConfig) groupRouter.POST("/dir/update", baseApi.UpdateSiteDir) + groupRouter.POST("/dir/permission", baseApi.UpdateSiteDirPermission) } } diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 5bc0f6f77..825e070be 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -18,6 +18,8 @@ export namespace Website { webSiteSSL: SSL; runtimeID: number; rewrite: string; + user: string; + group: string; } export interface WebsiteDTO extends Website { @@ -299,4 +301,10 @@ export namespace Website { id: number; siteDir: string; } + + export interface DirPermissionUpdate { + id: number; + user: string; + group: string; + } } diff --git a/frontend/src/api/modules/website.ts b/frontend/src/api/modules/website.ts index 6bd09d60b..5feeb0c66 100644 --- a/frontend/src/api/modules/website.ts +++ b/frontend/src/api/modules/website.ts @@ -182,3 +182,7 @@ export const UpdateRewriteConfig = (req: Website.RewriteUpdate) => { export const UpdateWebsiteDir = (req: Website.DirUpdate) => { return http.post(`/websites/dir/update`, req); }; + +export const UpdateWebsiteDirPermission = (req: Website.DirPermissionUpdate) => { + return http.post(`/websites/dir/permission`, req); +}; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index aa72d8edc..adfda7634 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -428,6 +428,9 @@ const message = { remoteConn: 'External connection address', remoteConnHelper2: 'Use this address for non-container or external connections', localIP: 'Local IP', + userGroup: 'User/Group', + user: 'User', + uGroup: 'Group', }, container: { createContainer: 'Create container', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 465ddeac1..3f207528c 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1172,7 +1172,10 @@ const message = { runDir: '运行目录', runDirHelper: '部分程序需要指定二级目录作为运行目录,如ThinkPHP5,Laravel', runUserHelper: - '通过 PHP 运行环境部署的网站,需要将 index 和子目录下的所有文件、文件夹所有者和用户组设置为 1000,命令:chown -R 1000:1000 index', + '通过 PHP 运行环境部署的网站,需要将 index 和子目录下的所有文件、文件夹所有者和用户组设置为 1000', + userGroup: '运行用户/组', + user: '用户', + uGroup: '用户组', }, php: { short_open_tag: '短标签支持', diff --git a/frontend/src/views/website/website/config/basic/site-folder/index.vue b/frontend/src/views/website/website/config/basic/site-folder/index.vue index 497b68453..25beb716d 100644 --- a/frontend/src/views/website/website/config/basic/site-folder/index.vue +++ b/frontend/src/views/website/website/config/basic/site-folder/index.vue @@ -15,7 +15,7 @@ - + @@ -31,26 +31,26 @@ - + - - + + - - + + - 保存 + + {{ $t('commons.button.save') }} + - - - - - - + + +
{{ $t('website.wafFolder') }} @@ -58,18 +58,12 @@ {{ $t('website.logFoler') }} {{ $t('website.indexFolder') }} -
- - -