diff --git a/packages/libs/lib-server/src/system/settings/service/models.ts b/packages/libs/lib-server/src/system/settings/service/models.ts index 9c6f3e7cd..6218cdf99 100644 --- a/packages/libs/lib-server/src/system/settings/service/models.ts +++ b/packages/libs/lib-server/src/system/settings/service/models.ts @@ -88,6 +88,10 @@ export class SysPrivateSettings extends BaseSettings { pipelineMaxRunningCount?: number; + + environmentVars?: string = ''; + + sms?: { type?: string; config?: any; diff --git a/packages/libs/lib-server/src/system/settings/service/sys-settings-service.ts b/packages/libs/lib-server/src/system/settings/service/sys-settings-service.ts index 5ae977b12..47bd32164 100644 --- a/packages/libs/lib-server/src/system/settings/service/sys-settings-service.ts +++ b/packages/libs/lib-server/src/system/settings/service/sys-settings-service.ts @@ -11,6 +11,8 @@ import { BaseService, setAdminMode } from '../../../basic/index.js'; import { executorQueue } from '../../basic/service/executor-queue.js'; import { isComm } from '@certd/plus-core'; const { merge } = mergeUtils; + +let lastSaveEnvVars = {}; /** * 设置 */ @@ -117,12 +119,12 @@ export class SysSettingsService extends BaseService { } async savePublicSettings(bean: SysPublicSettings) { - if(isComm()){ - if(bean.adminMode === 'enterprise'){ + if (isComm()) { + if (bean.adminMode === 'enterprise') { throw new Error("商业版不支持使用企业管理模式") } } - + await this.saveSetting(bean); //让设置生效 await this.reloadPublicSettings(); @@ -173,6 +175,44 @@ export class SysSettingsService extends BaseService { } setSslProviderReverseProxies(privateSetting.reverseProxies); + + //加载环境变量 + this.setEnvironmentVars(privateSetting.environmentVars); + } + + setEnvironmentVars(vars: string) { + const envVars = {} + if (typeof vars !== 'string') { + vars = "" + } + vars.split('\n').forEach(line => { + line = line.trim(); + if (!line || line.startsWith('#')) { + return + } + + const arr = line.split("#") + if (arr.length > 0) { + line = arr[0].trim(); + } + if (!line.includes("=")) { + return + } + + const [key, value] = line.split('='); + if (key && value) { + envVars[key.trim()] = value.trim(); + } + }); + //先删除旧环境变量 + if (lastSaveEnvVars) { + for (const key in lastSaveEnvVars) { + delete process.env[key]; + } + } + + merge(process.env, envVars); + lastSaveEnvVars = envVars; } async updateByKey(key: string, setting: any) { diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index e9908ff73..31726d292 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -38,6 +38,10 @@ COPY ./patch/ssh2/*.js /app/node_modules/.pnpm/node_modules/ssh2/lib/protocol/ ENV LEGO_VERSION=4.30.1 ENV LEGO_DOWNLOAD_DIR=/app/tools/lego + +ENV ALIYUN_CLIENT_CONNECT_TIMEOUT=10000 +ENV ALIYUN_CLIENT_READ_TIMEOUT=20000 + RUN mkdir -p $LEGO_DOWNLOAD_DIR # 根据架构下载不同的文件 diff --git a/packages/ui/certd-client/src/locales/langs/en-US/certd.ts b/packages/ui/certd-client/src/locales/langs/en-US/certd.ts index 4d72810aa..e43de9c36 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/certd.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/certd.ts @@ -789,6 +789,8 @@ export default { reverseProxyHelper: "Reverse proxy for ACME address, used when applying for certificate", reverseProxyPlaceholder: "http://le.px.handfree.work", reverseProxyEmpty: "No reverse proxy list configured", + environmentVars: "Environment Variables", + environmentVarsHelper: "configure the runtime environment variables, one per line, format: KEY=VALUE", }, }, modal: { diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts index 6a15e954a..cb3a5b48a 100644 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts @@ -800,6 +800,8 @@ export default { reverseProxyHelper: "证书颁发机构ACME地址的反向代理,在申请证书时自动使用", reverseProxyPlaceholder: "http://le.px.handfree.work", reverseProxyEmpty: "未配置反向代理", + environmentVars: "环境变量", + environmentVarsHelper: "配置运行时环境变量,每行一个,格式:KEY=VALUE", }, }, modal: { diff --git a/packages/ui/certd-client/src/store/settings/api.basic.ts b/packages/ui/certd-client/src/store/settings/api.basic.ts index 67a71a65b..2a17ba294 100644 --- a/packages/ui/certd-client/src/store/settings/api.basic.ts +++ b/packages/ui/certd-client/src/store/settings/api.basic.ts @@ -101,6 +101,8 @@ export type SysPrivateSetting = { commonCnameEnabled?: boolean; // 同一个用户同时最大运行流水线数量 pipelineMaxRunningCount?: number; + // 环境变量 + environmentVars?: string; sms?: { type?: string; diff --git a/packages/ui/certd-client/src/views/sys/settings/tabs/network.vue b/packages/ui/certd-client/src/views/sys/settings/tabs/network.vue index 0036898e5..e46614849 100644 --- a/packages/ui/certd-client/src/views/sys/settings/tabs/network.vue +++ b/packages/ui/certd-client/src/views/sys/settings/tabs/network.vue @@ -14,6 +14,11 @@
{{ t("certd.httpsProxyHelper") }}
+ + +
{{ t("certd.sys.setting.environmentVarsHelper") }}
+
+ {{ t("certd.default") }} @@ -55,6 +60,11 @@ defineOptions({ name: "SettingNetwork", }); +const environmentVarsExample = ref( + `ALIYUN_CLIENT_CONNECT_TIMEOUT=16000 #连接超时,单位毫秒 +ALIYUN_CLIENT_READ_TIMEOUT=16000 #读取数据超时,单位毫秒` +); + const formState = reactive>({ public: {}, private: {},