Files
Edu/services/teacher-bff/src/config/env.ts

60 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { z } from "zod";
// 环境变量定义B2 裁决gRPC 下游通信B8 裁决DownstreamClient 抽象)
// 端口分配见 docs/architecture/port-allocation.md §5
// iam 50052 / core-edu 50053 / content 50054 / data-ana 50055 / msg 50056 / ai 50058
// president §2.9TEACHER_BFF_DEV_MODE 控制越权防御 GuardP2 放行 / 生产拒绝)
const envSchema = z.object({
NODE_ENV: z.string().default("development"),
PORT: z.string().default("3003"),
LOG_LEVEL: z.string().default("info"),
// GraphQL endpoint 路径B1 裁决P2 起直接 GraphQL
GRAPHQL_PATH: z.string().default("/graphql"),
// 越权防御开关president §2.9P2 DEV_MODE 放行 + 日志告警,生产拒绝)
// 生产环境必须显式设为 false
TEACHER_BFF_DEV_MODE: z
.string()
.default("true")
.transform((v) => v === "true")
.pipe(z.boolean()),
// Redis/readyz 探针 + 后续 DataLoader 缓存)
REDIS_URL: z.string().default("redis://localhost:6379"),
// 下游 gRPC targetsv2 默认值对齐 Docker 服务名 + 端口分配)
// 端口分配见 docs/architecture/port-allocation.md §5
// iam 50052 / core-edu 50053 / content 50054 / data-ana 50055 / msg 50056 / ai 50058
// Docker 部署:服务名解析通过 docker network本地开发覆盖为 localhost:<port>
// 选择策略TEACHER_BFF_DEV_MODE=true → mockfalse → gRPCtargets 默认已配置)
IAM_GRPC_TARGET: z.string().default("iam:50052"),
CORE_EDU_GRPC_TARGET: z.string().default("core-edu:50053"),
CONTENT_GRPC_TARGET: z.string().default("content:50054"),
DATA_ANA_GRPC_TARGET: z.string().default("data-ana:50055"),
MSG_GRPC_TARGET: z.string().default("msg:50056"),
AI_GRPC_TARGET: z.string().default("ai:50058"),
// 下游 REST 服务 URLadmin 域 REST 调用 + ARB-008 公告降级 REST only
// iam RESTusers/roles/permissions/audit 端点
// msg REST/announcements 公告端点ARB-008 裁决)
IAM_SERVICE_URL: z.string().default("http://iam:3002"),
MSG_SERVICE_URL: z.string().default("http://msg:3007"),
// 可观测性OTEL_EXPORTER_OTLP_ENDPOINT 缺省则不启用 tracer
OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),
OTEL_SERVICE_NAME: z.string().default("teacher-bff"),
});
export type Env = z.infer<typeof envSchema>;
export function loadEnv(): Env {
const result = envSchema.safeParse(process.env);
if (!result.success) {
throw new Error("Invalid env: " + JSON.stringify(result.error.flatten()));
}
return result.data;
}
export const env = loadEnv();