diff --git a/backend/app/dto/app.go b/backend/app/dto/app.go index 997f20908..8175754a8 100644 --- a/backend/app/dto/app.go +++ b/backend/app/dto/app.go @@ -90,6 +90,7 @@ type AppProperty struct { Github string `json:"github"` Document string `json:"document"` Version float64 `json:"version"` + GpuSupport bool `json:"gpuSupport"` } type AppConfigVersion struct { diff --git a/backend/app/dto/request/app.go b/backend/app/dto/request/app.go index e6e61870d..0e6efa204 100644 --- a/backend/app/dto/request/app.go +++ b/backend/app/dto/request/app.go @@ -33,6 +33,7 @@ type AppContainerConfig struct { DockerCompose string `json:"dockerCompose"` HostMode bool `json:"hostMode"` PullImage bool `json:"pullImage"` + GpuConfig bool `json:"gpuConfig"` } type AppInstalledSearch struct { diff --git a/backend/app/dto/response/app.go b/backend/app/dto/response/app.go index fc5754ce7..07985de98 100644 --- a/backend/app/dto/response/app.go +++ b/backend/app/dto/response/app.go @@ -41,6 +41,7 @@ type AppItem struct { Versions []string `json:"versions"` Limit int `json:"limit"` Tags []TagDTO `json:"tags"` + GpuSupport bool `json:"gpuSupport"` } type TagDTO struct { @@ -66,10 +67,11 @@ type AppInstalledCheck struct { type AppDetailDTO struct { model.AppDetail - Enable bool `json:"enable"` - Params interface{} `json:"params"` - Image string `json:"image"` - HostMode bool `json:"hostMode"` + Enable bool `json:"enable"` + Params interface{} `json:"params"` + Image string `json:"image"` + HostMode bool `json:"hostMode"` + GpuSupport bool `json:"gpuSupport"` } type IgnoredApp struct { diff --git a/backend/app/model/app.go b/backend/app/model/app.go index 4e3b47566..d4b41a9d7 100644 --- a/backend/app/model/app.go +++ b/backend/app/model/app.go @@ -20,6 +20,7 @@ type App struct { Type string `json:"type" gorm:"type:varchar(64);not null"` Status string `json:"status" gorm:"type:varchar(64);not null"` Required string `json:"required" gorm:"type:varchar(64);"` + GpuSupport bool `json:"gpuSupport"` CrossVersionUpdate bool `json:"crossVersionUpdate" yaml:"crossVersionUpdate"` Limit int `json:"limit" gorm:"type:Integer;not null"` Website string `json:"website" gorm:"type:varchar(64);not null"` diff --git a/backend/app/service/app.go b/backend/app/service/app.go index 4b644296c..8d1bf6fed 100644 --- a/backend/app/service/app.go +++ b/backend/app/service/app.go @@ -94,13 +94,14 @@ func (a AppService) PageApp(ctx *gin.Context, req request.AppSearch) (interface{ lang := strings.ToLower(common.GetLang(ctx)) for _, ap := range apps { appDTO := &response.AppItem{ - ID: ap.ID, - Name: ap.Name, - Key: ap.Key, - Type: ap.Type, - Icon: ap.Icon, - Resource: ap.Resource, - Limit: ap.Limit, + ID: ap.ID, + Name: ap.Name, + Key: ap.Key, + Type: ap.Type, + Icon: ap.Icon, + Resource: ap.Resource, + Limit: ap.Limit, + GpuSupport: ap.GpuSupport, } appDTO.Description = ap.GetDescription(ctx) appDTOs = append(appDTOs, appDTO) @@ -167,6 +168,7 @@ func (a AppService) GetApp(ctx *gin.Context, key string) (*response.AppDTO, erro if err != nil { return nil, err } + appDTO.GpuSupport = app.GpuSupport appDTO.Tags = tags return &appDTO, nil } @@ -264,6 +266,7 @@ func (a AppService) GetAppDetail(appID uint, version, appType string) (response. if err := checkLimit(app); err != nil { appDetailDTO.Enable = false } + appDetailDTO.GpuSupport = app.GpuSupport return appDetailDTO, nil } func (a AppService) GetAppDetailByID(id uint) (*response.AppDetailDTO, error) { @@ -862,6 +865,7 @@ func (a AppService) SyncAppListFromRemote() (err error) { global.LOG.Infof("Starting synchronization of application details...") for _, l := range list.Apps { app := appsMap[l.AppProperty.Key] + app.GpuSupport = l.AppProperty.GpuSupport if l.AppProperty.Version > 0 && common.CompareVersion(strconv.FormatFloat(l.AppProperty.Version, 'f', -1, 64), setting.SystemVersion) { delete(appsMap, l.AppProperty.Key) diff --git a/backend/app/service/app_utils.go b/backend/app/service/app_utils.go index 711f3e53b..a791c20bf 100644 --- a/backend/app/service/app_utils.go +++ b/backend/app/service/app_utils.go @@ -1500,6 +1500,18 @@ func addDockerComposeCommonParam(composeMap map[string]interface{}, serviceName deploy["resources"] = resource serviceValue["deploy"] = deploy + if req.GpuConfig { + resource["reservations"] = map[string]interface{}{ + "devices": []map[string]interface{}{ + { + "driver": "nvidia", + "count": "all", + "capabilities": []string{"gpu"}, + }, + }, + } + } + ports, ok := serviceValue["ports"].([]interface{}) if ok { for i, port := range ports { diff --git a/backend/init/migration/migrations/v_1_10.go b/backend/init/migration/migrations/v_1_10.go index cdb2687f5..8967fe837 100644 --- a/backend/init/migration/migrations/v_1_10.go +++ b/backend/init/migration/migrations/v_1_10.go @@ -372,7 +372,7 @@ var UpdateAppTag = &gormigrate.Migration{ } var UpdateApp = &gormigrate.Migration{ - ID: "20250114-update-app", + ID: "20250213-update-app", Migrate: func(tx *gorm.DB) error { if err := tx.AutoMigrate(&model.App{}); err != nil { return err diff --git a/frontend/src/api/interface/app.ts b/frontend/src/api/interface/app.ts index a7a05fe75..9b0aac2a7 100644 --- a/frontend/src/api/interface/app.ts +++ b/frontend/src/api/interface/app.ts @@ -14,6 +14,7 @@ export namespace App { type: string; status: string; limit: number; + gpuSupport: boolean; } export interface AppDTO extends App { @@ -46,6 +47,7 @@ export namespace App { dockerCompose: string; image: string; hostMode?: boolean; + gpuSupport: boolean; } export interface AppReq extends ReqPage { diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 47b9a0cfe..30390f359 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1927,6 +1927,9 @@ const message = { 'The left side is the old version, the right side is the new version. After editing, click to save the custom version', pullImage: 'Pull Image', pullImageHelper: 'Execute docker pull to pull the image before the application starts', + gpuConfig: 'GPU Acceleration', + gpuConfigHelper: + 'Please ensure the machine has an NVIDIA GPU and that NVIDIA drivers and the NVIDIA Docker Container Toolkit are installed', }, website: { website: 'Website | Websites', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 202a65f89..4657021d3 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1900,6 +1900,9 @@ const message = { '左側は古いバージョンで、右側は新しいバージョンです。編集後、クリックしてカスタムバージョンを保存します', pullImage: '画像を引っ張ります', pullImageHelper: 'アプリケーションが開始する前に、Docker Pullを実行して画像をプルします', + gpuConfig: 'GPU アクセラレーション', + gpuConfigHelper: + 'マシンにNVIDIA GPUが搭載されていることを確認し、NVIDIAドライバーとNVIDIA Docker Container Toolkitをインストールしてください。', }, website: { website: 'ウェブサイト|ウェブサイト', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index fb9140dbf..c7a6a7067 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1869,6 +1869,9 @@ const message = { diffHelper: '왼쪽은 이전 버전, 오른쪽은 새 버전입니다. 편집 후 사용자 정의 버전을 저장하려면 클릭하세요.', pullImage: '이미지 풀', pullImageHelper: '애플리케이션 시작 전에 docker pull 을 실행하여 이미지를 다운로드하세요.', + gpuConfig: 'GPU 가속', + gpuConfigHelper: + '기계에 NVIDIA GPU가 설치되어 있고 NVIDIA 드라이버와 NVIDIA Docker Container Toolkit이 설치되어 있는지 확인하십시오.', }, website: { website: '웹사이트 | 웹사이트들', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index c8023125e..61221938e 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1951,6 +1951,9 @@ const message = { diffHelper: 'Bahagian kiri ialah versi lama, kanan ialah versi baru.', pullImage: 'Tarik Imej', pullImageHelper: 'Laksanakan docker pull untuk menarik imej sebelum aplikasi dimulakan.', + gpuConfig: 'Pecutan GPU', + gpuConfigHelper: + 'Pastikan mesin mempunyai GPU NVIDIA dan pasang pemacu NVIDIA serta NVIDIA Docker Container Toolkit.', }, website: { website: 'Laman Web | Laman Web', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 173130e5c..124ba3d36 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1941,6 +1941,9 @@ const message = { 'O lado esquerdo é a versão antiga, o lado direito é a nova versão. Após editar, clique para salvar a versão personalizada', pullImage: 'Puxar Imagem', pullImageHelper: 'Execute o comando docker pull para puxar a imagem antes de iniciar o aplicativo', + gpuConfig: 'Aceleração de GPU', + gpuConfigHelper: + 'Certifique-se de que a máquina possui uma GPU NVIDIA e instale os drivers NVIDIA e o NVIDIA Docker Container Toolkit.', }, website: { website: 'Website | Websites', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 98cedec82..24b266d84 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1943,6 +1943,9 @@ const message = { 'Слева старая версия, справа новая версия. После редактирования нажмите для сохранения пользовательской версии', pullImage: 'Загрузить образ', pullImageHelper: 'Выполнить docker pull для загрузки образа перед запуском приложения', + gpuConfig: 'GPU Hızlandırma', + gpuConfigHelper: + 'Пожалуйста, убедитесь, что на машине есть NVIDIA GPU и установлены драйвера NVIDIA и NVIDIA Docker Container Toolkit', }, website: { website: 'Веб-сайт | Веб-сайты', diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index 7639eb539..0a2772e24 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -1802,6 +1802,8 @@ const message = { diffHelper: '左側為舊版本,右側為新版,編輯之後點選使用自訂版本儲存', pullImage: '拉取鏡像', pullImageHelper: '在應用啟動之前執行 docker pull 來拉取鏡像', + gpuConfig: 'GPU 加速', + gpuConfigHelper: '請確保機器有 NVIDIA GPU 並且安裝 NVIDIA 驅動程式和 NVIDIA Docker Container Toolkit。', }, website: { website: '網站', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 9e7c56120..903033bc4 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1801,6 +1801,8 @@ const message = { diffHelper: '左侧为旧版本,右侧为新版,编辑之后点击使用自定义版本保存', pullImage: '拉取镜像', pullImageHelper: '在应用启动之前执行 docker pull 来拉取镜像', + gpuConfig: 'GPU 加速', + gpuConfigHelper: '请确保机器有 NVIDIA GPU 并且安装 NVIDIA 驱动 和 NVIDIA docker Container Toolkit', }, website: { website: '网站', diff --git a/frontend/src/views/app-store/detail/install/index.vue b/frontend/src/views/app-store/detail/install/index.vue index 39db5e87b..b7907bc4d 100644 --- a/frontend/src/views/app-store/detail/install/index.vue +++ b/frontend/src/views/app-store/detail/install/index.vue @@ -108,6 +108,10 @@ {{ $t('app.editComposeHelper') }} + + + {{ $t('app.gpuConfigHelper') }} + {{ $t('app.pullImageHelper') }} @@ -198,6 +202,7 @@ const initData = () => ({ version: '', appID: '', pullImage: true, + gpuConfig: false, }); const req = reactive(initData()); const limits = ref({ @@ -215,6 +220,7 @@ const handleClose = () => { }; const paramKey = ref(1); const isHostMode = ref(false); +const gpuSupport = ref(false); const changeUnit = () => { if (req.memoryUnit == 'M') { @@ -262,6 +268,7 @@ const getAppDetail = async (version: string) => { isHostMode.value = res.data.hostMode; installData.value.params = res.data.params; paramKey.value++; + gpuSupport.value = res.data.gpuSupport; } catch (error) { } finally { loading.value = false;