fix api-server env override order
This commit is contained in:
@@ -74,6 +74,7 @@ ARK_CHARACTER_VIDEO_MODEL / DASHSCOPE_CHARACTER_VIDEO_MODEL
|
|||||||
3. 文本 LLM provider 为 `ark` 且未配置 `GENARRATIVE_LLM_BASE_URL` 时,仍回退到 Ark 公开基础 URL。
|
3. 文本 LLM provider 为 `ark` 且未配置 `GENARRATIVE_LLM_BASE_URL` 时,仍回退到 Ark 公开基础 URL。
|
||||||
4. 角色视频 provider 复用 Ark 且未配置 `ARK_CHARACTER_VIDEO_BASE_URL` 时,仍回退到 Ark 公开基础 URL。
|
4. 角色视频 provider 复用 Ark 且未配置 `ARK_CHARACTER_VIDEO_BASE_URL` 时,仍回退到 Ark 公开基础 URL。
|
||||||
5. 具体模型名缺失时不在配置层伪造默认模型,调用到对应能力时由下游配置校验返回缺配置错误。
|
5. 具体模型名缺失时不在配置层伪造默认模型,调用到对应能力时由下游配置校验返回缺配置错误。
|
||||||
|
6. 本地开发启动脚本与 Rust 入口会按 `.env` → `.env.local` → `.env.secrets.local` 逐级覆盖本地变量;`.env.secrets.local` 作为最后一级,会覆盖前两者同名变量。
|
||||||
|
|
||||||
## 示例文件
|
## 示例文件
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const apiServerExePath = resolve(
|
|||||||
'server-rs/target/debug/api-server.exe',
|
'server-rs/target/debug/api-server.exe',
|
||||||
);
|
);
|
||||||
|
|
||||||
function loadEnvFile(path, target) {
|
function loadEnvFile(path, target, override = false) {
|
||||||
if (!existsSync(path)) {
|
if (!existsSync(path)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -26,7 +26,7 @@ function loadEnvFile(path, target) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const [, key, rawValue] = match;
|
const [, key, rawValue] = match;
|
||||||
if (target[key] !== undefined) {
|
if (!override && target[key] !== undefined) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,8 +36,8 @@ function loadEnvFile(path, target) {
|
|||||||
|
|
||||||
const mergedEnv = { ...process.env };
|
const mergedEnv = { ...process.env };
|
||||||
loadEnvFile(resolve(repoRoot, '.env'), mergedEnv);
|
loadEnvFile(resolve(repoRoot, '.env'), mergedEnv);
|
||||||
loadEnvFile(resolve(repoRoot, '.env.local'), mergedEnv);
|
loadEnvFile(resolve(repoRoot, '.env.local'), mergedEnv, true);
|
||||||
loadEnvFile(resolve(repoRoot, '.env.secrets.local'), mergedEnv);
|
loadEnvFile(resolve(repoRoot, '.env.secrets.local'), mergedEnv, true);
|
||||||
|
|
||||||
mergedEnv.GENARRATIVE_API_HOST = mergedEnv.GENARRATIVE_API_HOST || '127.0.0.1';
|
mergedEnv.GENARRATIVE_API_HOST = mergedEnv.GENARRATIVE_API_HOST || '127.0.0.1';
|
||||||
mergedEnv.GENARRATIVE_API_PORT = mergedEnv.GENARRATIVE_API_PORT || '3100';
|
mergedEnv.GENARRATIVE_API_PORT = mergedEnv.GENARRATIVE_API_PORT || '3100';
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ mod tests {
|
|||||||
let state = seed_authenticated_state(AppConfig {
|
let state = seed_authenticated_state(AppConfig {
|
||||||
llm_base_url: server_url,
|
llm_base_url: server_url,
|
||||||
llm_api_key: Some("test-key".to_string()),
|
llm_api_key: Some("test-key".to_string()),
|
||||||
|
llm_model: "ark-router-test".to_string(),
|
||||||
..AppConfig::default()
|
..AppConfig::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
@@ -267,6 +268,7 @@ mod tests {
|
|||||||
let state = seed_authenticated_state(AppConfig {
|
let state = seed_authenticated_state(AppConfig {
|
||||||
llm_base_url: server_url,
|
llm_base_url: server_url,
|
||||||
llm_api_key: Some("test-key".to_string()),
|
llm_api_key: Some("test-key".to_string()),
|
||||||
|
llm_model: "ark-router-test".to_string(),
|
||||||
..AppConfig::default()
|
..AppConfig::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|||||||
@@ -99,10 +99,10 @@ fn run_api_server_with_runtime() -> Result<(), std::io::Error> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn run_api_server() -> Result<(), std::io::Error> {
|
async fn run_api_server() -> Result<(), std::io::Error> {
|
||||||
// 运行本地开发与联调时,优先从仓库根目录加载本地变量,避免手工逐项导出 OSS / APIMart 配置。
|
// 运行本地开发与联调时,按 .env -> .env.local -> .env.secrets.local 逐级覆盖本地变量。
|
||||||
let _ = dotenvy::from_filename(".env");
|
let _ = dotenvy::from_filename(".env");
|
||||||
let _ = dotenvy::from_filename(".env.local");
|
let _ = dotenvy::from_filename_override(".env.local");
|
||||||
let _ = dotenvy::from_filename(".env.secrets.local");
|
let _ = dotenvy::from_filename_override(".env.secrets.local");
|
||||||
|
|
||||||
// 统一先从配置对象读取监听地址,避免后续把环境变量读取散落到入口和路由层。
|
// 统一先从配置对象读取监听地址,避免后续把环境变量读取散落到入口和路由层。
|
||||||
let config = AppConfig::from_env();
|
let config = AppConfig::from_env();
|
||||||
|
|||||||
Reference in New Issue
Block a user