Loading...
Loading...
Compare original and translation side by side
| Environment | Purpose | API Keys | Data |
|---|---|---|---|
| Development | Local dev | Test keys | Sandbox |
| Staging | Pre-prod validation | Staging keys | Test data |
| Production | Live traffic | Production keys | Real data |
| 环境 | 用途 | API密钥 | 数据 |
|---|---|---|---|
| 开发环境 | 本地开发 | 测试密钥 | 沙箱数据 |
| 预发布环境(Staging) | 生产前验证 | 预发布密钥 | 测试数据 |
| 生产环境 | 线上流量 | 生产密钥 | 真实数据 |
config/
├── ideogram/
│ ├── base.json # Shared config
│ ├── development.json # Dev overrides
│ ├── staging.json # Staging overrides
│ └── production.json # Prod overridesconfig/
├── ideogram/
│ ├── base.json # Shared config
│ ├── development.json # Dev overrides
│ ├── staging.json # Staging overrides
│ └── production.json # Prod overrides{
"timeout": 30000,
"retries": 3,
"cache": {
"enabled": true,
"ttlSeconds": 60
}
}{
"timeout": 30000,
"retries": 3,
"cache": {
"enabled": true,
"ttlSeconds": 60
}
}{
"apiKey": "${IDEOGRAM_API_KEY}",
"baseUrl": "https://api-sandbox.ideogram.com",
"debug": true,
"cache": {
"enabled": false
}
}{
"apiKey": "${IDEOGRAM_API_KEY}",
"baseUrl": "https://api-sandbox.ideogram.com",
"debug": true,
"cache": {
"enabled": false
}
}{
"apiKey": "${IDEOGRAM_API_KEY_STAGING}",
"baseUrl": "https://api-staging.ideogram.com",
"debug": false
}{
"apiKey": "${IDEOGRAM_API_KEY_STAGING}",
"baseUrl": "https://api-staging.ideogram.com",
"debug": false
}{
"apiKey": "${IDEOGRAM_API_KEY_PROD}",
"baseUrl": "https://api.ideogram.com",
"debug": false,
"retries": 5
}{
"apiKey": "${IDEOGRAM_API_KEY_PROD}",
"baseUrl": "https://api.ideogram.com",
"debug": false,
"retries": 5
}// src/ideogram/config.ts
import baseConfig from '../../config/ideogram/base.json';
type Environment = 'development' | 'staging' | 'production';
function detectEnvironment(): Environment {
const env = process.env.NODE_ENV || 'development';
const validEnvs: Environment[] = ['development', 'staging', 'production'];
return validEnvs.includes(env as Environment)
? (env as Environment)
: 'development';
}
export function getIdeogramConfig() {
const env = detectEnvironment();
const envConfig = require(`../../config/ideogram/${env}.json`);
return {
...baseConfig,
...envConfig,
environment: env,
};
}// src/ideogram/config.ts
import baseConfig from '../../config/ideogram/base.json';
type Environment = 'development' | 'staging' | 'production';
function detectEnvironment(): Environment {
const env = process.env.NODE_ENV || 'development';
const validEnvs: Environment[] = ['development', 'staging', 'production'];
return validEnvs.includes(env as Environment)
? (env as Environment)
: 'development';
}
export function getIdeogramConfig() {
const env = detectEnvironment();
const envConfig = require(`../../config/ideogram/${env}.json`);
return {
...baseConfig,
...envConfig,
environment: env,
};
}undefinedundefinedundefinedundefinedenv:
IDEOGRAM_API_KEY: ${{ secrets.IDEOGRAM_API_KEY_${{ matrix.environment }} }}env:
IDEOGRAM_API_KEY: ${{ secrets.IDEOGRAM_API_KEY_${{ matrix.environment }} }}undefinedundefinedundefinedundefined// Prevent production operations in non-prod
function guardProductionOperation(operation: string): void {
const config = getIdeogramConfig();
if (config.environment !== 'production') {
console.warn(`[ideogram] ${operation} blocked in ${config.environment}`);
throw new Error(`${operation} only allowed in production`);
}
}
// Usage
async function deleteAllData() {
guardProductionOperation('deleteAllData');
// Dangerous operation here
}// Prevent production operations in non-prod
function guardProductionOperation(operation: string): void {
const config = getIdeogramConfig();
if (config.environment !== 'production') {
console.warn(`[ideogram] ${operation} blocked in ${config.environment}`);
throw new Error(`${operation} only allowed in production`);
}
}
// Usage
async function deleteAllData() {
guardProductionOperation('deleteAllData');
// Dangerous operation here
}const featureFlags: Record<Environment, Record<string, boolean>> = {
development: {
newFeature: true,
betaApi: true,
},
staging: {
newFeature: true,
betaApi: false,
},
production: {
newFeature: false,
betaApi: false,
},
};const featureFlags: Record<Environment, Record<string, boolean>> = {
development: {
newFeature: true,
betaApi: true,
},
staging: {
newFeature: true,
betaApi: false,
},
production: {
newFeature: false,
betaApi: false,
},
};| Issue | Cause | Solution |
|---|---|---|
| Wrong environment | Missing NODE_ENV | Set environment variable |
| Secret not found | Wrong secret path | Verify secret manager config |
| Config merge fails | Invalid JSON | Validate config files |
| Production guard triggered | Wrong environment | Check NODE_ENV value |
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 环境识别错误 | 未设置NODE_ENV | 设置环境变量 |
| 密钥未找到 | 密钥路径错误 | 验证密钥管理器配置 |
| 配置合并失败 | JSON格式无效 | 验证配置文件格式 |
| 生产环境防护触发 | 环境设置错误 | 检查NODE_ENV的值 |
const env = getIdeogramConfig();
console.log(`Running in ${env.environment} with ${env.baseUrl}`);const env = getIdeogramConfig();
console.log(`Running in ${env.environment} with ${env.baseUrl}`);ideogram-observabilityideogram-observability