diff --git a/backend/app/dto/ai.go b/backend/app/dto/ai.go index 1e0be554b..6c2065cae 100644 --- a/backend/app/dto/ai.go +++ b/backend/app/dto/ai.go @@ -40,4 +40,5 @@ type OllamaBindDomainRes struct { SSLID uint `json:"sslID"` AllowIPs []string `json:"allowIPs"` WebsiteID uint `json:"websiteID"` + ConnUrl string `json:"connUrl"` } diff --git a/backend/app/service/ai.go b/backend/app/service/ai.go index ebff2a129..4302d5541 100644 --- a/backend/app/service/ai.go +++ b/backend/app/service/ai.go @@ -279,6 +279,7 @@ func (u *AIToolService) GetBindDomain(req dto.OllamaBindDomainReq) (*dto.OllamaB if website.WebsiteSSLID > 0 { res.SSLID = website.WebsiteSSLID } + res.ConnUrl = fmt.Sprintf("%s://%s", strings.ToLower(website.Protocol), website.PrimaryDomain) res.AllowIPs = GetAllowIps(website) return res, nil } diff --git a/frontend/src/api/interface/ai.ts b/frontend/src/api/interface/ai.ts index 87e0d5c39..a120bea66 100644 --- a/frontend/src/api/interface/ai.ts +++ b/frontend/src/api/interface/ai.ts @@ -106,5 +106,6 @@ export namespace AI { sslID: number; allowIPs: string[]; websiteID?: number; + connUrl: string; } } diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 3430fec1b..678a0d832 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -2589,6 +2589,8 @@ const message = { proxyHelper2: 'Limit IP access to prevent exposure on the public internet', proxyHelper3: 'Enable streaming', proxyHelper4: 'Once created, you can view and manage it in the website list', + proxyHelper5: + 'After enabling, you can disable external access to the port in the App Store - Installed - Ollama - Parameters to improve security.', }, }; diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 0a8d34fe8..1be34c693 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -2557,6 +2557,8 @@ const message = { proxyHelper2: 'IP アクセスを制限し、パブリックインターネットでの露出を防止', proxyHelper3: 'ストリーミングを有効にする', proxyHelper4: '作成後、ウェブサイトリストで確認および管理できます', + proxyHelper5: + '有効にすると、アプリストア - インストール済み - Ollama - パラメータでポートの外部アクセスを無効にし、セキュリティを向上させることができます。', }, }; export default { diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index c7c36b05b..dff60f088 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -2519,6 +2519,8 @@ const message = { proxyHelper2: 'IP 접근을 제한하여 공용 인터넷에서의 노출을 방지', proxyHelper3: '스트리밍을 활성화', proxyHelper4: '생성 후, 웹사이트 목록에서 이를 보고 관리할 수 있습니다', + proxyHelper5: + '활성화한 후, 앱 스토어 - 설치됨 - Ollama - 매개변수에서 포트 외부 접근을 비활성화하여 보안을 강화할 수 있습니다.', }, }; diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 451b2647e..7d618dd96 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -2618,6 +2618,8 @@ const message = { proxyHelper2: 'Hadkan akses IP untuk mengelakkan pendedahan di internet awam', proxyHelper3: 'Aktifkan penstriman', proxyHelper4: 'Setelah selesai, anda boleh melihat dan mengurusnya dalam senarai laman web', + proxyHelper5: + 'Selepas diaktifkan, anda boleh melumpuhkan akses luaran ke port dalam App Store - Dipasang - Ollama - Parameter untuk meningkatkan keselamatan.', }, }; diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 282ecdb03..3a69518fa 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -2605,6 +2605,8 @@ const message = { cronJobHelper: 'Dispara alerta via SMS ao falhar na execução de tarefas', licenseHelper: 'A versão profissional suporta alertas via SMS', alertCountHelper: 'Frequência máxima diária de alertas', + proxyHelper5: + 'Após ativar, você pode desabilitar o acesso externo à porta na Loja de Aplicativos - Instalados - Ollama - Parâmetros para melhorar a segurança.', }, aitool: { proxy: 'Melhoria de Proxy AI', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index c2928a4a0..32a92786b 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -2611,6 +2611,8 @@ const message = { proxyHelper2: 'Ограничьте доступ по IP, чтобы предотвратить утечку данных в публичной сети', proxyHelper3: 'Включите потоковую передачу', proxyHelper4: 'После создания вы можете просматривать и управлять этим в списке сайтов', + proxyHelper5: + 'После включения вы можете отключить внешний доступ к порту в Магазине приложений - Установленные - Ollama - Параметры для повышения безопасности.', }, }; diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index 4558b9e0a..b0b1ec650 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -2426,6 +2426,7 @@ const message = { proxyHelper2: '限制 IP 訪問,防止在公共網絡上暴露', proxyHelper3: '啟用流式傳輸', proxyHelper4: '創建後,您可以在網站列表中查看並管理', + proxyHelper5: '啟用後,您可以在應用商店 - 已安裝 - Ollama - 參數中取消端口外部訪問以提高安全性。', }, }; export default { diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index d4720a440..fe3d15a44 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -2428,6 +2428,7 @@ const message = { proxyHelper2: '限制 IP 访问,防止在公网暴露', proxyHelper3: '开启流式传输', proxyHelper4: '创建完成之后可以在网站列表中查看并管理', + proxyHelper5: '开启之后可以在应用商店 - 已安装 - ollama - 参数中取消端口外部访问以提高安全性', }, }; export default { diff --git a/frontend/src/views/ai/model/conn/index.vue b/frontend/src/views/ai/model/conn/index.vue index 8af00cab2..4e50e32ba 100644 --- a/frontend/src/views/ai/model/conn/index.vue +++ b/frontend/src/views/ai/model/conn/index.vue @@ -29,7 +29,20 @@ {{ $t('ai_tools.model.container_conn_helper') }} - + + + + + {{ bindDomain.connUrl }} + + + + + + {{ $t('database.remoteConnHelper2') }} + + + @@ -66,6 +79,7 @@ import i18n from '@/lang'; import { ElForm } from 'element-plus'; import DrawerHeader from '@/components/drawer-header/index.vue'; import { getSettingInfo } from '@/api/modules/setting'; +import { getBindDomain } from '@/api/modules/ai'; const loading = ref(false); @@ -77,16 +91,21 @@ const form = reactive({ remoteIP: '', }); +const bindDomain = ref({ + connUrl: '', +}); interface DialogProps { port: number; containerName: string; + appinstallID: number; } const acceptParams = (param: DialogProps): void => { form.containerName = param.containerName; form.port = param.port; loadSystemIP(); + loadBindDomain(param.appinstallID); dialogVisible.value = true; }; @@ -99,6 +118,20 @@ const loadSystemIP = async () => { form.systemIP = res.data.systemIP || i18n.global.t('database.localIP'); }; +const loadBindDomain = async (appInstallID: number) => { + if (appInstallID == undefined || appInstallID <= 0) { + return; + } + try { + const res = await getBindDomain({ + appInstallID: appInstallID, + }); + if (res.data.websiteID > 0) { + bindDomain.value.connUrl = res.data.connUrl; + } + } catch (e) {} +}; + defineExpose({ acceptParams, }); diff --git a/frontend/src/views/ai/model/domain/index.vue b/frontend/src/views/ai/model/domain/index.vue index 7aa847624..b91f25f5d 100644 --- a/frontend/src/views/ai/model/domain/index.vue +++ b/frontend/src/views/ai/model/domain/index.vue @@ -24,6 +24,9 @@ + + {{ $t('aitool.proxyHelper4') }} + - {{ $t('aitool.proxyHelper4') }} + {{ $t('aitool.proxyHelper5') }} diff --git a/frontend/src/views/ai/model/index.vue b/frontend/src/views/ai/model/index.vue index 7e1ac3973..10cd541f4 100644 --- a/frontend/src/views/ai/model/index.vue +++ b/frontend/src/views/ai/model/index.vue @@ -18,11 +18,7 @@ v-model:appInstallID="appInstallID" @is-exist="checkExist" ref="appStatusRef" - > - - + >