Compare commits

...
Author SHA1 Message Date
Node 508e2ec372 fix: 修复分块上传文件资源未释放问题 (#5109) 2024-05-24 11:52:40 +08:00
Node 73e901bb94 fix: 修复几处日志文件未释放问题 (#5110) 2024-05-24 11:52:37 +08:00
ssongliu 8213ada7ac fix: 解决升级过程中备份问题 (#5107) 2024-05-24 11:52:34 +08:00
zhengkunwang b438a4483d feat: 文件列表行内权限支持修改用户和用户组 (#5093)
Refs https://github.com/1Panel-dev/1Panel/issues/4981
2024-05-22 14:31:49 +08:00
zhengkunwang fa00c9fadb fix: 解决网站排序错误的问题 (#5092)
Refs https://github.com/1Panel-dev/1Panel/issues/5021
2024-05-22 14:27:43 +08:00
ssongliu 77c73b6710 feat: 进程守护增加运行目录跳转 (#5088)
Refs #4953
2024-05-22 14:22:47 +08:00
zhengkunwang a73d13de00 fix: 解决部分应用图标不显示的问题 (#5080) 2024-05-22 14:22:26 +08:00
Anye 5e0abeaf47 添加WordPress的PHP扩展模板 (#5016) 2024-05-22 14:21:51 +08:00
Zolo e22f1dc313 feat: 首页监控中上下行流量数据单位自动格式化 (#4207) (#4989) 2024-05-22 14:21:43 +08:00
zhengkunwang 56ce7ddc88 fix: 解决上传证书状态异常的问题 (#4999)
Refs https://github.com/1Panel-dev/1Panel/issues/4976
2024-05-22 14:21:35 +08:00
lewisay 2ec19fb7d4 fix: 解决编辑证书时,其他域名格式不正确问题 (#4991)
#### What this PR does / why we need it?

#### Summary of your change

#### Please indicate you've done the following:

- [ ] Made sure tests are passing and test coverage is added if needed.
- [ ] Made sure commit message follow the rule of [Conventional Commits specification](https://www.conventionalcommits.org/).
- [ ] Considered the docs impact and opened a new docs issue or PR with docs changes if needed.
2024-05-22 14:21:23 +08:00
zhengkunwang b808038f37 fix: 解决进程守护命令不能输入空格的问题 (#4997) 2024-05-22 14:21:18 +08:00
ssongliu c8154901d5 feat: 存储卷清理增加清除所有标签 (#4994) 2024-05-22 14:21:12 +08:00
zhengkunwang 284aced52c fix: 解决应用名称存在大写导致无法升级的问题 (#4987)
Refs https://github.com/1Panel-dev/1Panel/issues/4986
2024-05-22 14:21:05 +08:00
19 changed files with 72 additions and 31 deletions
+1 -1
View File
@@ -609,7 +609,7 @@ func mergeChunks(fileName string, fileDir string, dstDir string, chunkCount int)
if err != nil {
return err
}
defer targetFile.Close()
for i := 0; i < chunkCount; i++ {
chunkPath := filepath.Join(fileDir, fmt.Sprintf("%s.%d", fileName, i))
chunkData, err := os.ReadFile(chunkPath)
+1 -1
View File
@@ -849,7 +849,7 @@ func (a AppService) SyncAppListFromRemote() (err error) {
return err
}
iconStr := ""
if !strings.Contains(string(body), "xml") {
if !strings.Contains(string(body), "<xml>") {
iconStr = base64.StdEncoding.EncodeToString(body)
}
_ = iconRes.Body.Close()
+3 -2
View File
@@ -455,7 +455,7 @@ func upgradeInstall(installID uint, detailID uint, backup, pullImage bool) error
upErr error
backupFile string
)
global.LOG.Infof(i18n.GetMsgByKey("UpgradeAppStart"))
global.LOG.Infof(i18n.GetMsgWithName("UpgradeAppStart", install.Name, nil))
if backup {
backupRecord, err := NewIBackupService().AppBackup(dto.CommonBackup{Name: install.App.Key, DetailName: install.Name})
if err == nil {
@@ -587,7 +587,8 @@ func upgradeInstall(installID uint, detailID uint, backup, pullImage bool) error
}
if pullImage {
images, err := composeV2.GetDockerComposeImages(install.Name, content, []byte(detail.DockerCompose))
projectName := strings.ToLower(install.Name)
images, err := composeV2.GetDockerComposeImages(projectName, content, []byte(detail.DockerCompose))
if err != nil {
upErr = err
return
+7
View File
@@ -323,6 +323,13 @@ func (u *ContainerService) Prune(req dto.ContainerPrune) (dto.ContainerPruneRepo
}
report.DeletedNumber = len(rep.NetworksDeleted)
case "volume":
versions, err := client.ServerVersion(context.Background())
if err != nil {
return report, err
}
if common.ComparePanelVersion(versions.APIVersion, "1.42") {
pruneFilters.Add("all", "true")
}
rep, err := client.VolumesPrune(context.Background(), pruneFilters)
if err != nil {
return report, err
+2 -2
View File
@@ -307,7 +307,7 @@ func (h *HostToolService) OperateSupervisorProcess(req request.SupervisorProcess
if err != nil {
return err
}
_, _ = section.NewKey("command", req.Command)
_, _ = section.NewKey("command", strings.TrimSpace(req.Command))
_, _ = section.NewKey("directory", req.Dir)
_, _ = section.NewKey("autorestart", "true")
_, _ = section.NewKey("startsecs", "3")
@@ -338,7 +338,7 @@ func (h *HostToolService) OperateSupervisorProcess(req request.SupervisorProcess
}
commandKey := section.Key("command")
commandKey.SetValue(req.Command)
commandKey.SetValue(strings.TrimSpace(req.Command))
directoryKey := section.Key("directory")
directoryKey.SetValue(req.Dir)
userKey := section.Key("user")
+1
View File
@@ -150,6 +150,7 @@ func runComposeCmdWithLog(operate string, composePath string, logPath string) er
global.LOG.Errorf("Failed to open log file: %v", err)
return err
}
defer logFile.Close()
multiWriterStdout := io.MultiWriter(os.Stdout, logFile)
cmd.Stdout = multiWriterStdout
var stderrBuf bytes.Buffer
+1 -1
View File
@@ -175,7 +175,7 @@ func (u *UpgradeService) handleBackup(fileOp files.FileOp, originalDir string) e
return err
}
checkPointOfWal()
if err := handleTar(path.Join(global.CONF.System.BaseDir, "1panel/db"), originalDir, "db.tar.gz", "./1Panel.db-*"); err != nil {
if err := handleTar(path.Join(global.CONF.System.BaseDir, "1panel/db"), originalDir, "db.tar.gz", "db/1Panel.db-*"); err != nil {
return err
}
return nil
+1
View File
@@ -431,6 +431,7 @@ func (w WebsiteSSLService) Upload(req request.WebsiteSSLUpload) error {
websiteSSL := &model.WebsiteSSL{
Provider: constant.Manual,
Description: req.Description,
Status: constant.SSLReady,
}
var err error
if req.SSLID > 0 {
@@ -124,6 +124,9 @@ var AddTablePHPExtensions = &gormigrate.Migration{
if err := tx.Create(&model.PHPExtensions{Name: "默认", Extensions: "bcmath,gd,gettext,intl,pcntl,shmop,soap,sockets,sysvsem,xmlrpc,zip"}).Error; err != nil {
return err
}
if err := tx.Create(&model.PHPExtensions{Name: "WordPress", Extensions: "exif,igbinary,imagick,intl,zip,apcu,memcached,opcache,redis,bc,image,shmop,mysqli,pdo_mysql"}).Error; err != nil {
return err
}
if err := tx.Create(&model.PHPExtensions{Name: "苹果CMS-V10", Extensions: "mysqli,pdo_mysql,zip,gd,redis,memcache,memcached"}).Error; err != nil {
return err
}
+4 -1
View File
@@ -224,7 +224,10 @@ func (r *Local) Backup(info BackupInfo) error {
return fmt.Errorf("mkdir %s failed, err: %v", info.TargetDir, err)
}
}
outfile, _ := os.OpenFile(path.Join(info.TargetDir, info.FileName), os.O_RDWR|os.O_CREATE, 0755)
outfile, err := os.OpenFile(path.Join(info.TargetDir, info.FileName), os.O_RDWR|os.O_CREATE, 0755)
if err == nil {
defer outfile.Close()
}
dumpCmd := "mysqldump"
if r.Type == constant.AppMariaDB {
dumpCmd = "mariadb-dump"
+4 -1
View File
@@ -235,7 +235,10 @@ func (r *Remote) Backup(info BackupInfo) error {
return fmt.Errorf("mkdir %s failed, err: %v", info.TargetDir, err)
}
}
outfile, _ := os.OpenFile(path.Join(info.TargetDir, info.FileName), os.O_RDWR|os.O_CREATE, 0755)
outfile, err := os.OpenFile(path.Join(info.TargetDir, info.FileName), os.O_RDWR|os.O_CREATE, 0755)
if err == nil {
defer outfile.Close()
}
dumpCmd := "mysqldump"
if r.Type == constant.AppMariaDB {
dumpCmd = "mariadb-dump"
+4 -1
View File
@@ -129,7 +129,10 @@ func (r *Local) Backup(info BackupInfo) error {
return fmt.Errorf("mkdir %s failed, err: %v", info.TargetDir, err)
}
}
outfile, _ := os.OpenFile(path.Join(info.TargetDir, info.FileName), os.O_RDWR|os.O_CREATE, 0755)
outfile, err := os.OpenFile(path.Join(info.TargetDir, info.FileName), os.O_RDWR|os.O_CREATE, 0755)
if err == nil {
defer outfile.Close()
}
global.LOG.Infof("start to pg_dump | gzip > %s.gzip", info.TargetDir+"/"+info.FileName)
cmd := exec.Command("docker", "exec", r.ContainerName, "pg_dump", "-F", "c", "-U", r.Username, "-d", info.Name)
gzipCmd := exec.Command("gzip", "-cf")
+7 -3
View File
@@ -125,8 +125,12 @@
<template #body>
<div style="position: relative; margin-top: 20px">
<div class="monitor-tags" v-if="chartOption === 'network'">
<el-tag>{{ $t('monitor.up') }}: {{ currentChartInfo.netBytesSent }} KB/s</el-tag>
<el-tag>{{ $t('monitor.down') }}: {{ currentChartInfo.netBytesRecv }} KB/s</el-tag>
<el-tag>
{{ $t('monitor.up') }}: {{ computeSizeFromKBs(currentChartInfo.netBytesSent) }}
</el-tag>
<el-tag>
{{ $t('monitor.down') }}: {{ computeSizeFromKBs(currentChartInfo.netBytesRecv) }}
</el-tag>
<el-tag>{{ $t('home.totalSend') }}: {{ computeSize(currentInfo.netBytesSent) }}</el-tag>
<el-tag>{{ $t('home.totalRecv') }}: {{ computeSize(currentInfo.netBytesRecv) }}</el-tag>
</div>
@@ -247,7 +251,7 @@ import LicenseImport from '@/components/license-import/index.vue';
import CardWithHeader from '@/components/card-with-header/index.vue';
import i18n from '@/lang';
import { Dashboard } from '@/api/interface/dashboard';
import { dateFormatForSecond, computeSize } from '@/utils/util';
import { dateFormatForSecond, computeSize, computeSizeFromKBs } from '@/utils/util';
import { useRouter } from 'vue-router';
import { loadBaseInfo, loadCurrentInfo } from '@/api/modules/dashboard';
import { getIOOptions, getNetworkOptions } from '@/api/modules/host';
@@ -244,7 +244,7 @@
</el-link>
</template>
</el-table-column>
<el-table-column :label="$t('file.group')" prop="group">
<el-table-column :label="$t('file.group')" prop="group" show-overflow-tooltip>
<template #default="{ row }">
<el-link :underline="false" @click="openChown(row)">
{{ row.group ? row.group : '-' }} ({{ row.gid }})
@@ -863,7 +863,9 @@ const buttons = [
},
{
label: i18n.global.t('file.mode'),
click: openMode,
click: (row: File.File) => {
openBatchRole([row]);
},
},
{
label: i18n.global.t('file.compress'),
@@ -21,7 +21,7 @@
</el-input>
</el-form-item>
<el-form-item :label="$t('tool.supervisor.command')" prop="command">
<el-input v-model.trim="process.command"></el-input>
<el-input v-model="process.command"></el-input>
</el-form-item>
<el-form-item :label="$t('tool.supervisor.numprocs')" prop="numprocsNum">
<el-input type="number" v-model.number="process.numprocsNum"></el-input>
@@ -33,13 +33,11 @@
fix
show-overflow-tooltip
></el-table-column>
<el-table-column
:label="$t('tool.supervisor.dir')"
prop="dir"
min-width="100px"
fix
show-overflow-tooltip
></el-table-column>
<el-table-column :label="$t('tool.supervisor.dir')" prop="dir" min-width="100px" fix>
<template #default="{ row }">
<Tooltip @click="toFolder(row.dir)" :text="row.dir" />
</template>
</el-table-column>
<el-table-column
:label="$t('tool.supervisor.user')"
prop="user"
@@ -161,6 +159,7 @@ import i18n from '@/lang';
import { HostTool } from '@/api/interface/host-tool';
import { MsgSuccess } from '@/utils/message';
import { VideoPlay, VideoPause, RefreshRight } from '@element-plus/icons-vue';
import router from '@/routers';
const globalStore = GlobalStore();
const loading = ref(false);
@@ -186,6 +185,10 @@ const getStatus = (status: any) => {
search();
};
const toFolder = (folder: string) => {
router.push({ path: '/hosts/files', query: { path: folder } });
};
const showStopped = computed((): boolean => {
if (supervisorStatus.value.init || setSuperVisor.value) {
return false;
@@ -256,7 +256,7 @@ const acceptParams = (op: string, websiteSSL: Website.SSLDTO) => {
ssl.value.primaryDomain = websiteSSL.primaryDomain;
ssl.value.pushDir = websiteSSL.pushDir;
ssl.value.dir = websiteSSL.dir;
ssl.value.otherDomains = websiteSSL.domains;
ssl.value.otherDomains = websiteSSL.domains?.replace(/,/g, '\n');
ssl.value.autoRenew = websiteSSL.autoRenew;
ssl.value.description = websiteSSL.description;
ssl.value.id = websiteSSL.id;
+2 -2
View File
@@ -239,8 +239,8 @@ const buttons = [
click: function (row: Website.SSLDTO) {
onEdit(row);
},
disabled: function (row: Website.SSLDTO) {
return row.provider == 'selfSigned';
show: function (row: Website.SSLDTO) {
return row.provider != 'manual' && row.provider != 'selfSigned';
},
},
{
+15 -5
View File
@@ -54,7 +54,7 @@
<ComplexTable
:pagination-config="paginationConfig"
:data="data"
@sort-change="search"
@sort-change="changeSort"
@search="search()"
:class="{ mask: nginxStatus != 'Running' }"
>
@@ -251,12 +251,22 @@ let req = reactive({
const mobile = computed(() => {
return globalStore.isMobile();
});
const search = async (column?: any) => {
const changeSort = ({ prop, order }) => {
if (order) {
req.orderBy = prop == 'primaryDomain' ? 'primary_domain' : prop;
req.order = order;
} else {
req.orderBy = 'created_at';
req.order = 'null';
}
search();
};
const search = async () => {
req.page = paginationConfig.currentPage;
req.pageSize = paginationConfig.pageSize;
req.orderBy = column?.order ? column.prop : 'created_at';
req.orderBy = req.orderBy === 'primaryDomain' ? 'primary_domain' : req.orderBy;
req.order = column?.order ? column.order : 'null';
loading.value = true;
await SearchWebsites(req)
.then((res) => {