fix api-server env override order

This commit is contained in:
2026-05-08 14:57:47 +08:00
parent 7e8cc22859
commit 8fd0d1b281
4 changed files with 10 additions and 7 deletions

View File

@@ -74,6 +74,7 @@ ARK_CHARACTER_VIDEO_MODEL / DASHSCOPE_CHARACTER_VIDEO_MODEL
3. 文本 LLM provider 为 `ark` 且未配置 `GENARRATIVE_LLM_BASE_URL` 时,仍回退到 Ark 公开基础 URL。
4. 角色视频 provider 复用 Ark 且未配置 `ARK_CHARACTER_VIDEO_BASE_URL` 时,仍回退到 Ark 公开基础 URL。
5. 具体模型名缺失时不在配置层伪造默认模型,调用到对应能力时由下游配置校验返回缺配置错误。
6. 本地开发启动脚本与 Rust 入口会按 `.env``.env.local``.env.secrets.local` 逐级覆盖本地变量;`.env.secrets.local` 作为最后一级,会覆盖前两者同名变量。
## 示例文件

View File

@@ -8,7 +8,7 @@ const apiServerExePath = resolve(
'server-rs/target/debug/api-server.exe',
);
function loadEnvFile(path, target) {
function loadEnvFile(path, target, override = false) {
if (!existsSync(path)) {
return;
}
@@ -26,7 +26,7 @@ function loadEnvFile(path, target) {
}
const [, key, rawValue] = match;
if (target[key] !== undefined) {
if (!override && target[key] !== undefined) {
continue;
}
@@ -36,8 +36,8 @@ function loadEnvFile(path, target) {
const mergedEnv = { ...process.env };
loadEnvFile(resolve(repoRoot, '.env'), mergedEnv);
loadEnvFile(resolve(repoRoot, '.env.local'), mergedEnv);
loadEnvFile(resolve(repoRoot, '.env.secrets.local'), mergedEnv);
loadEnvFile(resolve(repoRoot, '.env.local'), mergedEnv, true);
loadEnvFile(resolve(repoRoot, '.env.secrets.local'), mergedEnv, true);
mergedEnv.GENARRATIVE_API_HOST = mergedEnv.GENARRATIVE_API_HOST || '127.0.0.1';
mergedEnv.GENARRATIVE_API_PORT = mergedEnv.GENARRATIVE_API_PORT || '3100';

View File

@@ -192,6 +192,7 @@ mod tests {
let state = seed_authenticated_state(AppConfig {
llm_base_url: server_url,
llm_api_key: Some("test-key".to_string()),
llm_model: "ark-router-test".to_string(),
..AppConfig::default()
})
.await;
@@ -267,6 +268,7 @@ mod tests {
let state = seed_authenticated_state(AppConfig {
llm_base_url: server_url,
llm_api_key: Some("test-key".to_string()),
llm_model: "ark-router-test".to_string(),
..AppConfig::default()
})
.await;

View File

@@ -99,10 +99,10 @@ fn run_api_server_with_runtime() -> 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.local");
let _ = dotenvy::from_filename(".env.secrets.local");
let _ = dotenvy::from_filename_override(".env.local");
let _ = dotenvy::from_filename_override(".env.secrets.local");
// 统一先从配置对象读取监听地址,避免后续把环境变量读取散落到入口和路由层。
let config = AppConfig::from_env();