diff --git a/agent/app/dto/app.go b/agent/app/dto/app.go
index db7433236..76c52852d 100644
--- a/agent/app/dto/app.go
+++ b/agent/app/dto/app.go
@@ -99,6 +99,7 @@ type AppProperty struct {
MemoryRequired int `json:"memoryRequired"`
GpuSupport bool `json:"gpuSupport"`
Version float64 `json:"version"`
+ Deprecated float64 `json:"deprecated"`
}
type AppConfigVersion struct {
diff --git a/agent/app/repo/app.go b/agent/app/repo/app.go
index 853e94528..1ae312e69 100644
--- a/agent/app/repo/app.go
+++ b/agent/app/repo/app.go
@@ -148,7 +148,7 @@ func (a AppRepo) BatchDelete(ctx context.Context, apps []model.App) error {
}
func (a AppRepo) DeleteByIDs(ctx context.Context, ids []uint) error {
- return getTx(ctx).Where("id in (?)", ids).Delete(&model.App{}).Error
+ return getTx(ctx).Debug().Where("id in (?)", ids).Delete(&model.App{}).Error
}
func (a AppRepo) DeleteBy(opts ...DBOption) error {
diff --git a/agent/app/service/app_utils.go b/agent/app/service/app_utils.go
index 9869d57f9..336c5ee88 100644
--- a/agent/app/service/app_utils.go
+++ b/agent/app/service/app_utils.go
@@ -1185,11 +1185,16 @@ func getApps(oldApps []model.App, items []dto.AppDefine, systemVersion string, t
apps[old.Key] = old
}
for _, item := range items {
- if item.AppProperty.Version > 0 && common.CompareVersion(strconv.FormatFloat(item.AppProperty.Version, 'f', -1, 64), systemVersion) {
+ config := item.AppProperty
+ if config.Version > 0 && common.CompareVersion(strconv.FormatFloat(config.Version, 'f', -1, 64), systemVersion) {
task.Log(i18n.GetWithName("AppVersionNotMatch", item.Name))
continue
}
- config := item.AppProperty
+ if config.Deprecated > 0 && common.CompareAppVersion(systemVersion, strconv.FormatFloat(config.Deprecated, 'f', -1, 64)) {
+ task.Log(i18n.GetWithName("AppVersionNotMatch", item.Name))
+ continue
+ }
+
key := config.Key
app, ok := apps[key]
if !ok {
diff --git a/agent/app/service/nginx.go b/agent/app/service/nginx.go
index 00d9e0f90..fcd1908e5 100644
--- a/agent/app/service/nginx.go
+++ b/agent/app/service/nginx.go
@@ -235,14 +235,14 @@ func (n NginxService) Build(req request.NginxBuildReq) error {
if err != nil {
return err
}
- buildTask.AddSubTask("", func(t *task.Task) error {
- cmdMgr := cmd2.NewCommandMgr(cmd.WithTask(*buildTask), cmd.WithTimeout(15*time.Minute))
+ buildTask.AddSubTaskWithOps("", func(t *task.Task) error {
+ cmdMgr := cmd2.NewCommandMgr(cmd.WithTask(*buildTask), cmd.WithTimeout(60*time.Minute))
if err = cmdMgr.RunBashCf("docker compose -f %s build", nginxInstall.GetComposePath()); err != nil {
return err
}
_, err = compose.DownAndUp(nginxInstall.GetComposePath())
return err
- }, nil)
+ }, nil, 0, 60*time.Minute)
go func() {
_ = buildTask.Execute()
diff --git a/agent/app/task/task.go b/agent/app/task/task.go
index bfd0d51b3..efc794271 100644
--- a/agent/app/task/task.go
+++ b/agent/app/task/task.go
@@ -142,12 +142,12 @@ func NewTask(name, operate, taskScope, taskID string, resourceID uint) (*Task, e
}
func (t *Task) AddSubTask(name string, action ActionFunc, rollback RollbackFunc) {
- subTask := &SubTask{RootTask: t, Name: name, Retry: 0, Timeout: 10 * time.Minute, Action: action, Rollback: rollback}
+ subTask := &SubTask{RootTask: t, Name: name, Retry: 0, Timeout: 30 * time.Minute, Action: action, Rollback: rollback}
t.SubTasks = append(t.SubTasks, subTask)
}
func (t *Task) AddSubTaskWithAlias(key string, action ActionFunc, rollback RollbackFunc) {
- subTask := &SubTask{RootTask: t, Name: i18n.GetMsgByKey(key), StepAlias: key, Retry: 0, Timeout: 10 * time.Minute, Action: action, Rollback: rollback}
+ subTask := &SubTask{RootTask: t, Name: i18n.GetMsgByKey(key), StepAlias: key, Retry: 0, Timeout: 30 * time.Minute, Action: action, Rollback: rollback}
t.SubTasks = append(t.SubTasks, subTask)
}
@@ -157,7 +157,7 @@ func (t *Task) AddSubTaskWithOps(name string, action ActionFunc, rollback Rollba
}
func (t *Task) AddSubTaskWithIgnoreErr(name string, action ActionFunc) {
- subTask := &SubTask{RootTask: t, Name: name, Retry: 0, Timeout: 10 * time.Minute, Action: action, Rollback: nil, IgnoreErr: true}
+ subTask := &SubTask{RootTask: t, Name: name, Retry: 0, Timeout: 30 * time.Minute, Action: action, Rollback: nil, IgnoreErr: true}
t.SubTasks = append(t.SubTasks, subTask)
}
diff --git a/agent/i18n/lang/en.yaml b/agent/i18n/lang/en.yaml
index e1a8aafec..cd46c85f7 100644
--- a/agent/i18n/lang/en.yaml
+++ b/agent/i18n/lang/en.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: 'Pull image timeout, please try to increase the image accelera
ErrAppIsDown: '{{ .name }} application status is abnormal, please check'
ErrCustomApps: 'There is an installed application, please uninstall it first'
ErrCustomRuntimes: 'There is an installed runtime environment, please delete it first'
+ErrAppVersionDeprecated: "The {{ .name }} application is not compatible with the current 1Panel version, skipped"
#file
ErrFileCanNotRead: 'This file does not support preview'
diff --git a/agent/i18n/lang/ja.yaml b/agent/i18n/lang/ja.yaml
index 4148654f4..2706cba61 100644
--- a/agent/i18n/lang/ja.yaml
+++ b/agent/i18n/lang/ja.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: 'プル イメージのタイムアウトです。イメージ
ErrAppIsDown: '{{ .name }} アプリケーションの状態が異常です。確認してください'
ErrCustomApps: 'インストールされているアプリケーションがあります。まずアンインストールしてください'
ErrCustomRuntimes: 'ランタイム環境がインストールされています。まずそれを削除してください'
+ErrAppVersionDeprecated: "{{ .name }} アプリケーションは現在の 1Panel バージョンと互換性がありません、スキップしました"
#file
ErrFileCanNotRead: 'このファイルはプレビューをサポートしていません'
diff --git a/agent/i18n/lang/ko.yaml b/agent/i18n/lang/ko.yaml
index d7d13ea87..66b6848cd 100644
--- a/agent/i18n/lang/ko.yaml
+++ b/agent/i18n/lang/ko.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: '이미지 가져오기 시간 초과, 이미지 가속을 높
ErrAppIsDown: '{{ .name }} 애플리케이션 상태가 비정상적입니다. 확인해 주세요'
ErrCustomApps: '설치된 애플리케이션이 있습니다. 먼저 제거해 주세요'
ErrCustomRuntimes: '설치된 런타임 환경이 있습니다. 먼저 삭제해 주세요'
+ErrAppVersionDeprecated: "{{ .name }} 응용 프로그램은 현재 1Panel 버전과 호환되지 않아 건너뛰었습니다"
#파일
ErrFileCanNotRead: '이 파일은 미리보기를 지원하지 않습니다'
diff --git a/agent/i18n/lang/ms.yaml b/agent/i18n/lang/ms.yaml
index 53450d93c..f88fc716e 100644
--- a/agent/i18n/lang/ms.yaml
+++ b/agent/i18n/lang/ms.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: 'Tarik tamat masa imej, sila cuba tingkatkan pecutan imej atau
ErrAppIsDown: 'Status permohonan {{ .name }} tidak normal, sila semak'
ErrCustomApps: 'Ada aplikasi yang dipasang, sila nyahpasangnya dahulu'
ErrCustomRuntimes: 'Terdapat persekitaran masa jalan yang dipasang, sila padamkannya dahulu'
+ErrAppVersionDeprecated: "Aplikasi {{ .name }} tidak sesuai dengan versi 1Panel saat ini, dilewati"
#fail
ErrFileCanNotRead: 'Fail ini tidak menyokong pratonton'
diff --git a/agent/i18n/lang/pt-BR.yaml b/agent/i18n/lang/pt-BR.yaml
index 26d898f37..aedd3bea9 100644
--- a/agent/i18n/lang/pt-BR.yaml
+++ b/agent/i18n/lang/pt-BR.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: 'Tempo limite para puxar imagem, tente aumentar a aceleração
ErrAppIsDown: 'O status do aplicativo {{ .name }} é anormal, verifique'
ErrCustomApps: 'Há um aplicativo instalado, desinstale-o primeiro'
ErrCustomRuntimes: 'Há um ambiente de execução instalado, exclua-o primeiro'
+ErrAppVersionDeprecated: "O aplicativo {{ .name }} não é compatível com a versão atual do 1Panel, ignorado"
#arquivo
ErrFileCanNotRead: 'Este arquivo não suporta visualização'
diff --git a/agent/i18n/lang/ru.yaml b/agent/i18n/lang/ru.yaml
index 2187fb749..fe07cd0b2 100644
--- a/agent/i18n/lang/ru.yaml
+++ b/agent/i18n/lang/ru.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: 'Истекло время ожидания извлечени
ErrAppIsDown: '{{ .name }} статус приложения ненормальный, проверьте'
ErrCustomApps: 'Установлено приложение. Сначала удалите его'
ErrCustomRuntimes: 'Установлена среда выполнения. Сначала удалите ее'
+ErrAppVersionDeprecated: "Приложение {{ .name }} несовместимо с текущей версией 1Panel, пропущено"
#файл
ErrFileCanNotRead: 'Этот файл не поддерживает предварительный просмотр'
diff --git a/agent/i18n/lang/zh-Hant.yaml b/agent/i18n/lang/zh-Hant.yaml
index cc6877c41..223198ca2 100644
--- a/agent/i18n/lang/zh-Hant.yaml
+++ b/agent/i18n/lang/zh-Hant.yaml
@@ -90,6 +90,7 @@ PullImageTimeout: '拉取鏡像逾時,請嘗試增加鏡像加速或更換其他
ErrAppIsDown: '{{ .name }} 應用程式狀態異常,請檢查'
ErrCustomApps: '存在已安裝的應用程式,請先解除安裝'
ErrCustomRuntimes: '存在已安裝的運作環境,請先刪除'
+ErrAppVersionDeprecated: "{{ .name }} 應用不適配當前 1Panel 版本,跳過"
#file
ErrFileCanNotRead: '此檔案不支援預覽'
diff --git a/agent/i18n/lang/zh.yaml b/agent/i18n/lang/zh.yaml
index 91620f879..0f00d75b4 100644
--- a/agent/i18n/lang/zh.yaml
+++ b/agent/i18n/lang/zh.yaml
@@ -89,6 +89,7 @@ PullImageTimeout: "拉取镜像超时,请尝试增加镜像加速或者更换其
ErrAppIsDown: "{{ .name }} 应用状态异常,请检查"
ErrCustomApps: "存在已经安装的应用,请先卸载"
ErrCustomRuntimes: "存在已经安装的运行环境,请先删除"
+ErrAppVersionDeprecated: " {{ .name }} 应用不适配当前 1Panel 版本,跳过"
#file
ErrFileCanNotRead: "此文件不支持预览"
diff --git a/agent/utils/cmd/cmdx.go b/agent/utils/cmd/cmdx.go
index 28a86bb3f..e45bab7b3 100644
--- a/agent/utils/cmd/cmdx.go
+++ b/agent/utils/cmd/cmdx.go
@@ -49,6 +49,10 @@ func RunDefaultWithStdoutBashCf(command string, arg ...interface{}) (string, err
mgr := NewCommandMgr(WithTimeout(20 * time.Second))
return mgr.RunWithStdoutBashCf(command, arg...)
}
+func RunDefaultWithStdoutBashCfAndTimeOut(command string, timeout time.Duration, arg ...interface{}) (string, error) {
+ mgr := NewCommandMgr(WithTimeout(timeout))
+ return mgr.RunWithStdoutBashCf(command, arg...)
+}
func (c *CommandHelper) Run(name string, arg ...string) error {
_, err := c.run(name, arg...)
diff --git a/agent/utils/compose/compose.go b/agent/utils/compose/compose.go
index c2f73c268..84b99b5a1 100644
--- a/agent/utils/compose/compose.go
+++ b/agent/utils/compose/compose.go
@@ -2,10 +2,11 @@ package compose
import (
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
+ "time"
)
func Up(filePath string) (string, error) {
- stdout, err := cmd.RunDefaultWithStdoutBashCf("docker compose -f %s up -d", filePath)
+ stdout, err := cmd.RunDefaultWithStdoutBashCfAndTimeOut("docker compose -f %s up -d", 20*time.Minute, filePath)
return stdout, err
}
diff --git a/frontend/src/components/log/container/index.vue b/frontend/src/components/log/container/index.vue
index 9fc4af9a7..98cfdfadf 100644
--- a/frontend/src/components/log/container/index.vue
+++ b/frontend/src/components/log/container/index.vue
@@ -117,6 +117,7 @@ const timeOptions = ref([
const stopListening = () => {
if (eventSource) {
eventSource.close();
+ eventSource = null;
}
};
@@ -130,8 +131,8 @@ const searchLogs = async () => {
MsgError(i18n.global.t('container.linesHelper'));
return;
}
+ stopListening();
if (!logSearch.isWatch) {
- stopListening();
return;
}
logs.value = [];
diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts
index fdb5ebe64..a3b81d606 100644
--- a/frontend/src/lang/modules/en.ts
+++ b/frontend/src/lang/modules/en.ts
@@ -2134,9 +2134,9 @@ const message = {
specifyIP: 'Bind Host IP',
specifyIPHelper:
'Set the host address/network interface to bind the port (if you are not sure about this, please do not fill it in)',
- uninstallDeleteBackup: 'Uninstall App Deletes Backup',
- uninstallDeleteImage: 'Uninstall App Deletes Image',
- upgradeBackup: 'Backup Before Upgrading App',
+ uninstallDeleteBackup: 'Uninstall App - Delete Backup',
+ uninstallDeleteImage: 'Uninstall App - Delete Image',
+ upgradeBackup: 'Backup App Before Upgrade',
},
website: {
primaryDomain: 'Primary Domain',
diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts
index 71b1d0fec..e583159db 100644
--- a/frontend/src/lang/modules/ja.ts
+++ b/frontend/src/lang/modules/ja.ts
@@ -2039,9 +2039,9 @@ const message = {
specifyIP: 'ホスト IP をバインド',
specifyIPHelper:
'ポートにバインドするホストアドレス/ネットワークインターフェースを設定します(この機能がわからない場合は、入力しないでください)',
- uninstallDeleteBackup: 'アプリをアンインストールしてバックアップを削除',
- uninstallDeleteImage: 'アプリをアンインストールしてイメージを削除',
- upgradeBackup: 'アプリのアップグレード前にバックアップ',
+ uninstallDeleteBackup: 'アプリをアンインストール - バックアップを削除',
+ uninstallDeleteImage: 'アプリをアンインストール - イメージを削除',
+ upgradeBackup: 'アプリのアップグレード前にアプリをバックアップ',
},
website: {
primaryDomain: 'プライマリドメイン',
diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts
index 7d0a7b90d..ead596094 100644
--- a/frontend/src/lang/modules/ko.ts
+++ b/frontend/src/lang/modules/ko.ts
@@ -2004,9 +2004,9 @@ const message = {
specifyIP: '호스트 IP 바인딩',
specifyIPHelper:
'포트 바인딩을 위한 호스트 주소/네트워크 인터페이스를 설정합니다 (이 기능을 잘 모를 경우, 입력하지 마십시오)',
- uninstallDeleteBackup: '앱 제거 및 백업 삭제',
- uninstallDeleteImage: '앱 제거 및 이미지 삭제',
- upgradeBackup: '앱 업그레이드 전 백업',
+ uninstallDeleteBackup: '앱 제거 - 백업 삭제',
+ uninstallDeleteImage: '앱 제거 - 이미지 삭제',
+ upgradeBackup: '앱 업그레이드 전 앱 백업',
},
website: {
primaryDomain: '기본 도메인',
diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts
index 0812e62c4..fc3f85e78 100644
--- a/frontend/src/lang/modules/ms.ts
+++ b/frontend/src/lang/modules/ms.ts
@@ -2095,7 +2095,7 @@ const message = {
'Tetapkan alamat hos/antara muka rangkaian untuk mengikat port (jika anda tidak pasti mengenai ini, jangan isi)',
uninstallDeleteBackup: 'Cop Terhapus Semasa Nyahpasang Aplikasi',
uninstallDeleteImage: 'Imej Terhapus Semasa Nyahpasang Aplikasi',
- upgradeBackup: 'Sandaran Sebelum Naik Taraf Aplikasi',
+ upgradeBackup: 'Sandaran Aplikasi Sebelum Naik Taraf',
},
website: {
primaryDomain: 'Domain Utama',
diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts
index 174f339fe..b797b5e4e 100644
--- a/frontend/src/lang/modules/pt-br.ts
+++ b/frontend/src/lang/modules/pt-br.ts
@@ -2086,9 +2086,9 @@ const message = {
specifyIP: 'Vincular IP do Host',
specifyIPHelper:
'Defina o endereço do host/interface de rede para vincular a porta (se você não tiver certeza sobre isso, por favor, não preencha)',
- uninstallDeleteBackup: 'Desinstalar Aplicativo Deleta Backup',
- uninstallDeleteImage: 'Desinstalar Aplicativo Deleta Imagem',
- upgradeBackup: 'Fazer Backup Antes de Atualizar o Aplicativo',
+ uninstallDeleteBackup: 'Desinstalar Aplicativo - Excluir Backup',
+ uninstallDeleteImage: 'Desinstalar Aplicativo - Excluir Imagem',
+ upgradeBackup: 'Fazer Backup do Aplicativo Antes de Atualizar',
},
website: {
primaryDomain: 'Domínio principal',
diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts
index a1efebe95..56615fd3a 100644
--- a/frontend/src/lang/modules/ru.ts
+++ b/frontend/src/lang/modules/ru.ts
@@ -2086,9 +2086,9 @@ const message = {
specifyIP: 'Привязать IP хоста',
specifyIPHelper:
'Установите адрес хоста/сетевого интерфейса для привязки порта (если вы не уверены в этом, пожалуйста, не заполняйте)',
- uninstallDeleteBackup: 'Деинсталляция приложения удаляет резервную копию',
- uninstallDeleteImage: 'Деинсталляция приложения удаляет образ',
- upgradeBackup: 'Резервное копирование перед обновлением приложения',
+ uninstallDeleteBackup: 'Деинсталляция приложения - Удаление резервной копии',
+ uninstallDeleteImage: 'Деинсталляция приложения - Удаление образа',
+ upgradeBackup: 'Резервное копирование приложения перед обновлением',
},
website: {
primaryDomain: 'Основной домен',
diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts
index d82a9cf8a..53ba0f6bf 100644
--- a/frontend/src/lang/modules/zh-Hant.ts
+++ b/frontend/src/lang/modules/zh-Hant.ts
@@ -1974,9 +1974,9 @@ const message = {
ignoreVersion: '忽略指定版本',
specifyIP: '綁定主機 IP',
specifyIPHelper: '設置端口綁定的主機地址/網卡(如果你不清楚這個的作用,請不要填寫)',
- uninstallDeleteBackup: '卸載應用刪除備份',
- uninstallDeleteImage: '卸載應用刪除鏡像',
- upgradeBackup: '升級應用前備份',
+ uninstallDeleteBackup: '卸載應用-刪除備份',
+ uninstallDeleteImage: '卸載應用-刪除鏡像',
+ upgradeBackup: '應用升級前備份應用',
},
website: {
primaryDomain: '主域名',
diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts
index 73cbe9a06..d9340b2af 100644
--- a/frontend/src/lang/modules/zh.ts
+++ b/frontend/src/lang/modules/zh.ts
@@ -1964,9 +1964,9 @@ const message = {
ignoreVersion: '忽略指定版本',
specifyIP: '绑定主机 IP',
specifyIPHelper: '设置端口绑定的主机地址/网卡(如果你不清楚这个的作用,请不要填写)',
- uninstallDeleteBackup: '卸载应用删除备份',
- uninstallDeleteImage: '卸载应用删除镜像',
- upgradeBackup: '升级应用前备份',
+ uninstallDeleteBackup: '卸载应用-删除备份',
+ uninstallDeleteImage: '卸载应用-删除镜像',
+ upgradeBackup: '应用升级前备份应用',
},
website: {
primaryDomain: '主域名',
@@ -3091,7 +3091,7 @@ const message = {
offlineHelper: '节点为离线环境时使用',
},
customApp: {
- name: '自定义应用仓库',
+ name: '自定义仓库',
appStoreType: '仓库来源',
appStoreUrl: '仓库地址',
local: '本地',
@@ -3099,7 +3099,7 @@ const message = {
imagePrefix: '镜像前缀',
imagePrefixHelper:
'作用:自定义镜像前缀,修改 compose 文件中的镜像字段,例如:当镜像前缀设置为 1panel/custom 时,MaxKB 的 image 字段将变更为 1panel/custom/maxkb:v1.10.0',
- closeHelper: '是否取消使用自定义应用仓库',
+ closeHelper: '是否取消使用自定义仓库',
appStoreUrlHelper: '仅支持 .tar.gz 格式',
postNode: '同步至子节点',
postNodeHelper: '把自定义商店包同步至子节点的安装目录下的 tmp/customApp/apps.tar.gz 中',
diff --git a/frontend/src/views/website/website/nginx/module/build/index.vue b/frontend/src/views/website/website/nginx/module/build/index.vue
index 646ac06fe..d994e6266 100644
--- a/frontend/src/views/website/website/nginx/module/build/index.vue
+++ b/frontend/src/views/website/website/nginx/module/build/index.vue
@@ -12,12 +12,12 @@
label="http://mirrors.aliyun.com/ubuntu/"
>