From b090e50f722d1123b74552b5537bf940acf2abbe Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 22 Jun 2023 20:39:17 +0800 Subject: [PATCH 1/3] chore: use NODE_TYPE to determine node type --- README.md | 13 +++++++------ common/constants.go | 2 +- common/redis.go | 4 ++-- docker-compose.yml | 4 +++- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index fe5d7888..d06df9ed 100644 --- a/README.md +++ b/README.md @@ -152,12 +152,11 @@ sudo service nginx restart ### 多机部署 1. 所有服务器 `SESSION_SECRET` 设置一样的值。 2. 必须设置 `SQL_DSN`,使用 MySQL 数据库而非 SQLite,所有服务器连接同一个数据库。 -3. 所有从服务器必须设置 `SYNC_FREQUENCY`,以定期从数据库同步配置。 -4. 从服务器可以选择设置 `FRONTEND_BASE_URL`,以重定向页面请求到主服务器。 -5. 从服务器上**分别**装好 Redis,设置好 `REDIS_CONN_STRING`,这样可以做到在缓存未过期的情况下数据库零访问,可以减少延迟。 -6. 如果主服务器访问数据库延迟也比较高,则也需要启用 Redis,并设置 `SYNC_FREQUENCY`,以定期从数据库同步配置。 - -注意,设置 `SYNC_FREQUENCY` 后会导致从服务器的状态不会实时更新,而是定期同步。 +3. 所有从服务器必须设置 `NODE_TYPE` 为 `slave`。 +4. 设置 `SYNC_FREQUENCY` 后服务器将定期从数据库同步配置。 +5. 从服务器可以选择设置 `FRONTEND_BASE_URL`,以重定向页面请求到主服务器。 +6. 从服务器上**分别**装好 Redis,设置好 `REDIS_CONN_STRING`,这样可以做到在缓存未过期的情况下数据库零访问,可以减少延迟。 +7. 如果主服务器访问数据库延迟也比较高,则也需要启用 Redis,并设置 `SYNC_FREQUENCY`,以定期从数据库同步配置。 环境变量的具体使用方法详见[此处](#环境变量)。 @@ -249,6 +248,8 @@ graph LR + 例子:`FRONTEND_BASE_URL=https://openai.justsong.cn` 5. `SYNC_FREQUENCY`:设置之后将定期与数据库同步配置,单位为秒,未设置则不进行同步。 + 例子:`SYNC_FREQUENCY=60` +6. `NODE_TYPE`:设置之后将指定节点类型,可选值为 `master` 和 `slave`,未设置则默认为 `master`。 + + 例子:`NODE_TYPE=slave` ### 命令行参数 1. `--port `: 指定服务器监听的端口号,默认为 `3000`。 diff --git a/common/constants.go b/common/constants.go index d84cfd25..373ad88a 100644 --- a/common/constants.go +++ b/common/constants.go @@ -68,7 +68,7 @@ var PreConsumedQuota = 500 var RootUserEmail = "" -var IsMasterNode = os.Getenv("SYNC_FREQUENCY") == "" +var IsMasterNode = os.Getenv("NODE_TYPE") != "slave" const ( RoleGuestUser = 0 diff --git a/common/redis.go b/common/redis.go index 35b84d70..1a05721c 100644 --- a/common/redis.go +++ b/common/redis.go @@ -17,9 +17,9 @@ func InitRedisClient() (err error) { SysLog("REDIS_CONN_STRING not set, Redis is not enabled") return nil } - if IsMasterNode { - SysLog("Redis is disabled on master node") + if os.Getenv("SYNC_FREQUENCY") == "" { RedisEnabled = false + SysLog("SYNC_FREQUENCY not set, Redis is disabled") return nil } SysLog("Redis is enabled") diff --git a/docker-compose.yml b/docker-compose.yml index 8158a3ee..003122bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,10 @@ services: - REDIS_CONN_STRING=redis://redis - SESSION_SECRET=random_string # 修改为随机字符串 - TZ=Asia/Shanghai -# - SYNC_FREQUENCY=60 # 多机部署时从节点取消注释该行 +# - NODE_TYPE=slave # 多机部署时从节点取消注释该行 +# - SYNC_FREQUENCY=60 # 需要定期从数据库加载数据时取消注释该行 # - FRONTEND_BASE_URL=https://openai.justsong.cn # 多机部署时从节点取消注释该行 + depends_on: - redis healthcheck: From fe135fd5081830b36357e740037b0099912e80b1 Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 22 Jun 2023 20:49:55 +0800 Subject: [PATCH 2/3] chore: update base url setting --- web/src/pages/Channel/EditChannel.js | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js index 0e544d47..3bec68b3 100644 --- a/web/src/pages/Channel/EditChannel.js +++ b/web/src/pages/Channel/EditChannel.js @@ -181,9 +181,9 @@ const EditChannel = () => { inputs.type !== 3 && inputs.type !== 8 && ( { handleInputChange(null, { name: 'models', value: fullModels }); }}>填入所有模型 - { - inputs.type === 1 && ( - - - - ) - } { batch ? Date: Thu, 22 Jun 2023 20:53:21 +0800 Subject: [PATCH 3/3] chore: able to clear all models now --- web/src/pages/Channel/EditChannel.js | 31 +++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js index 3bec68b3..58b80219 100644 --- a/web/src/pages/Channel/EditChannel.js +++ b/web/src/pages/Channel/EditChannel.js @@ -32,15 +32,15 @@ const EditChannel = () => { let res = await API.get(`/api/channel/${channelId}`); const { success, message, data } = res.data; if (success) { - if (data.models === "") { - data.models = [] + if (data.models === '') { + data.models = []; } else { - data.models = data.models.split(",") + data.models = data.models.split(','); } - if (data.group === "") { - data.groups = [] + if (data.group === '') { + data.groups = []; } else { - data.groups = data.group.split(",") + data.groups = data.group.split(','); } setInputs(data); } else { @@ -55,10 +55,10 @@ const EditChannel = () => { setModelOptions(res.data.data.map((model) => ({ key: model.id, text: model.id, - value: model.id, + value: model.id }))); setFullModels(res.data.data.map((model) => model.id)); - setBasicModels(res.data.data.filter((model) => !model.id.startsWith("gpt-4")).map((model) => model.id)); + setBasicModels(res.data.data.filter((model) => !model.id.startsWith('gpt-4')).map((model) => model.id)); } catch (error) { showError(error.message); } @@ -70,7 +70,7 @@ const EditChannel = () => { setGroupOptions(res.data.data.map((group) => ({ key: group, text: group, - value: group, + value: group }))); } catch (error) { showError(error.message); @@ -90,6 +90,10 @@ const EditChannel = () => { showInfo('请填写渠道名称和渠道密钥!'); return; } + if (inputs.models.length === 0) { + showInfo('请至少选择一个模型!'); + return; + } let localInputs = inputs; if (localInputs.base_url.endsWith('/')) { localInputs.base_url = localInputs.base_url.slice(0, localInputs.base_url.length - 1); @@ -98,8 +102,8 @@ const EditChannel = () => { localInputs.other = '2023-03-15-preview'; } let res; - localInputs.models = localInputs.models.join(",") - localInputs.group = localInputs.groups.join(",") + localInputs.models = localInputs.models.join(','); + localInputs.group = localInputs.groups.join(','); if (isEdit) { res = await API.put(`/api/channel/`, { ...localInputs, id: parseInt(channelId) }); } else { @@ -231,13 +235,16 @@ const EditChannel = () => { options={modelOptions} /> -
+
+
{ batch ?