import {mergeApiServerEnv} from './dev-utils.mjs'; const REQUIRED_FOR_PUZZLE_GENERATION = [ 'VECTOR_ENGINE_BASE_URL', 'VECTOR_ENGINE_API_KEY', 'ALIYUN_OSS_BUCKET', 'ALIYUN_OSS_ENDPOINT', 'ALIYUN_OSS_ACCESS_KEY_ID', 'ALIYUN_OSS_ACCESS_KEY_SECRET', ]; const COMMON_MISTYPED_KEYS = [ 'ALIYUN_0SS_BUCKET', 'ALIYUN_0SS_ENDPOINT', 'ALIYUN_0SS_ACCESS_KEY_ID', 'ALIYUN_0SS_ACCESS_KEY_SECRET', ]; function hasValue(value) { return typeof value === 'string' && value.trim().length > 0; } function printStatus(key, present) { console.log(`${key}: ${present ? 'present' : 'missing'}`); } const env = mergeApiServerEnv(process.cwd(), process.env); const missing = []; console.log('[api-server-env] 认证短信配置检查'); printStatus('SMS_AUTH_ENABLED', env.SMS_AUTH_ENABLED === 'true'); printStatus('SMS_AUTH_PROVIDER', hasValue(env.SMS_AUTH_PROVIDER)); console.log('[api-server-env] 编辑器真实生成配置检查'); for (const key of REQUIRED_FOR_PUZZLE_GENERATION) { const present = hasValue(env[key]); printStatus(key, present); if (!present) { missing.push(key); } } const typoKeys = COMMON_MISTYPED_KEYS.filter((key) => hasValue(env[key])); if (typoKeys.length > 0) { console.log( `[api-server-env] 检测到疑似拼错的 OSS 键名:${typoKeys.join(', ')}`, ); } // 阿里云通用抠图兜底层:默认 enabled=true,但 AccessKey 缺失时会被静默跳过, // BgFilter 失败直接本地去背(质量下降)。属可选降级项,只告警不阻断部署。 console.log('[api-server-env] 抠图兜底(阿里云通用抠图)配置检查'); const mattingEnabled = env.GENARRATIVE_ALIYUN_MATTING_ENABLED !== 'false'; const mattingKeyPresent = hasValue(env.GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_ID) || hasValue(env.ALIBABA_CLOUD_ACCESS_KEY_ID); const mattingSecretPresent = hasValue(env.GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_SECRET) || hasValue(env.ALIBABA_CLOUD_ACCESS_KEY_SECRET); printStatus( 'GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_ID / ALIBABA_CLOUD_ACCESS_KEY_ID', mattingKeyPresent, ); printStatus( 'GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_SECRET / ALIBABA_CLOUD_ACCESS_KEY_SECRET', mattingSecretPresent, ); if (mattingEnabled && !(mattingKeyPresent && mattingSecretPresent)) { console.warn( '[api-server-env] 警告:GENARRATIVE_ALIYUN_MATTING_ENABLED 未关闭但缺少 AccessKey,' + '阿里云抠图兜底层将被跳过,BgFilter 失败后直接本地去背(质量下降)。', ); } if (missing.length > 0) { console.error(`[api-server-env] 缺少:${missing.join(', ')}`); process.exit(1); } console.log('[api-server-env] 配置齐全。重启 npm run dev:api-server 或 npm run dev 后生效。');