feat: expand production config and documentation for provider integrations

This commit is contained in:
Codex
2026-02-18 13:35:19 +00:00
parent 74ab63f488
commit 415c9d165a
5 changed files with 217 additions and 6 deletions

View File

@@ -19,12 +19,40 @@ function strFromEnv(name, fallback) {
return raw && String(raw).trim() ? String(raw).trim() : fallback;
}
function listFromEnv(name, fallback = []) {
const raw = process.env[name];
if (!raw) {
return fallback;
}
return String(raw)
.split(",")
.map((item) => item.trim())
.filter(Boolean);
}
const parsed = {
port: intFromEnv("PORT", 3000),
stateFilePath: strFromEnv("STATE_FILE_PATH", "./data/state.json"),
logLevel: strFromEnv("LOG_LEVEL", "info"),
appBaseUrl: strFromEnv("APP_BASE_URL", "http://localhost:3000"),
xWebhookSecret: process.env.X_WEBHOOK_SECRET || "dev-x-secret",
xBearerToken: strFromEnv("X_BEARER_TOKEN", ""),
xBotUserId: strFromEnv("X_BOT_USER_ID", ""),
polarWebhookSecret: process.env.POLAR_WEBHOOK_SECRET || "dev-polar-secret",
polarAccessToken: strFromEnv("POLAR_ACCESS_TOKEN", ""),
polarServer: strFromEnv("POLAR_SERVER", "production"),
polarProductIds: listFromEnv("POLAR_PRODUCT_IDS", []),
ttsApiKey: strFromEnv("TTS_API_KEY", ""),
ttsBaseUrl: strFromEnv("TTS_BASE_URL", ""),
ttsModel: strFromEnv("TTS_MODEL", "gpt-4o-mini-tts"),
ttsVoice: strFromEnv("TTS_VOICE", "alloy"),
s3Bucket: strFromEnv("S3_BUCKET", ""),
s3Region: strFromEnv("S3_REGION", ""),
s3Endpoint: strFromEnv("S3_ENDPOINT", ""),
s3AccessKeyId: strFromEnv("S3_ACCESS_KEY_ID", ""),
s3SecretAccessKey: strFromEnv("S3_SECRET_ACCESS_KEY", ""),
s3SignedUrlTtlSec: intFromEnv("S3_SIGNED_URL_TTL_SEC", 3600),
rateLimits: {
webhookPerMinute: intFromEnv("WEBHOOK_RPM", 120),
authPerMinute: intFromEnv("AUTH_RPM", 30),
@@ -43,8 +71,24 @@ const ConfigSchema = z.object({
port: z.number().int().positive(),
stateFilePath: z.string().min(1),
logLevel: z.enum(["fatal", "error", "warn", "info", "debug", "trace", "silent"]),
appBaseUrl: z.string().min(1),
xWebhookSecret: z.string().min(1),
xBearerToken: z.string(),
xBotUserId: z.string(),
polarWebhookSecret: z.string().min(1),
polarAccessToken: z.string(),
polarServer: z.enum(["production", "sandbox"]),
polarProductIds: z.array(z.string().min(1)),
ttsApiKey: z.string(),
ttsBaseUrl: z.string(),
ttsModel: z.string().min(1),
ttsVoice: z.string().min(1),
s3Bucket: z.string(),
s3Region: z.string(),
s3Endpoint: z.string(),
s3AccessKeyId: z.string(),
s3SecretAccessKey: z.string(),
s3SignedUrlTtlSec: z.number().int().positive(),
rateLimits: z.object({
webhookPerMinute: z.number().int().positive(),
authPerMinute: z.number().int().positive(),