- 注册 @fastify/rate-limit,默认每个来源 IP 每分钟 600 次,RATE_LIMIT_MAX 可调、0 关闭 - submit-baidu-urls 的 decodeXmlEntities 最后替换 &,避免二次解码 - 对应 CodeQL js/missing-rate-limiting 与 js/double-escaping 告警 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
178 lines
8.1 KiB
Bash
178 lines
8.1 KiB
Bash
NODE_ENV=development
|
|
HOST=0.0.0.0
|
|
PORT=4300
|
|
# 反向代理信任:false 不信任;正整数表示信任最近 N 跳;逗号分隔的 IP/CIDR 只信任这些代理(生产推荐,例如 127.0.0.1,::1)。
|
|
# 设为 true 会信任所有上游,只有在 API 端口完全无法直连时才可以这么做。
|
|
TRUST_PROXY=false
|
|
# 全局限流:每个来源 IP 每分钟允许的请求数,0 关闭;登录、注册等接口另有更严格的限制。
|
|
RATE_LIMIT_MAX=600
|
|
DATABASE_URL=postgres://lindyson:lindyson@localhost:5432/lindyson
|
|
REDIS_URL=redis://localhost:6379
|
|
JWT_SECRET=change-this-to-a-long-random-secret
|
|
# 生产双域名示例:
|
|
# CORS_ORIGIN=https://lindyson.com,https://www.lindyson.com,https://lindyson.cn,https://www.lindyson.cn
|
|
CORS_ORIGIN=http://localhost:5173,http://localhost:8080
|
|
# 支付和退款通知使用此公开地址;生产必须使用本站 HTTPS。
|
|
PUBLIC_BASE_URL=http://localhost:4300
|
|
APP_BASE_URL=http://localhost:5173
|
|
|
|
# local 或 tos。开发默认 local,生产使用 tos。
|
|
STORAGE_DRIVER=local
|
|
LOCAL_STORAGE_DIR=./storage
|
|
STORAGE_PUBLIC_BASE_URL=
|
|
|
|
# TOS/S3 兼容对象存储,仅 STORAGE_DRIVER=tos 时需要。
|
|
# TOS_ENDPOINT 供服务端 S3 SDK 读写/删除;浏览器 PostObject 地址按 TOS_BUCKET + TOS_REGION 生成原生 TOS 域名。
|
|
TOS_ENDPOINT=
|
|
TOS_REGION=cn-beijing
|
|
TOS_BUCKET=
|
|
TOS_ACCESS_KEY_ID=
|
|
TOS_SECRET_ACCESS_KEY=
|
|
TOS_READ_URL_EXPIRES_SECONDS=43200
|
|
TOS_FORCE_PATH_STYLE=false
|
|
|
|
# 火山方舟 Seedance 与 Seedream 5.0 Pro。生产必须配置 ARK_API_KEY;模型固定为受审版本,禁止 latest 别名。
|
|
ARK_API_KEY=
|
|
ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
|
|
ARK_SEEDANCE_MODEL=doubao-seedance-2-0-260128
|
|
ARK_SEEDANCE_FAST_MODEL=doubao-seedance-2-0-fast-260128
|
|
ARK_SEEDANCE_MINI_MODEL=doubao-seedance-2-0-mini-260615
|
|
ARK_SEEDANCE_25_MODEL=doubao-seedance-2-5-260628
|
|
ARK_SEEDREAM_MODEL=doubao-seedream-5-0-pro-260628
|
|
ARK_SEEDREAM_TIMEOUT_MS=180000
|
|
ARK_POLL_INTERVAL_MS=5000
|
|
ARK_TASK_TIMEOUT_MS=900000
|
|
ARK_DOWNLOAD_TIMEOUT_MS=120000
|
|
# 成片归档下载:连续 30 秒收不到数据视为停滞,整个下载最多 10 分钟,超时后自动重试(共 3 次)
|
|
ARK_ARCHIVE_STALL_TIMEOUT_MS=30000
|
|
ARK_ARCHIVE_TOTAL_TIMEOUT_MS=600000
|
|
|
|
# 真人演员库使用 Ark Assets API 的 IAM Access Key 签名鉴权,不能复用上面的 ARK_API_KEY。
|
|
# disabled:关闭真实供应商;fake:仅开发/测试;volcengine:正式火山方舟 Assets API。
|
|
REAL_PORTRAIT_PROVIDER_MODE=disabled
|
|
VOLC_ARK_ASSET_ACCESS_KEY_ID=
|
|
VOLC_ARK_ASSET_SECRET_ACCESS_KEY=
|
|
VOLC_ARK_ASSET_ENDPOINT=https://ark.cn-beijing.volcengineapi.com/
|
|
VOLC_ARK_ASSET_REGION=cn-beijing
|
|
VOLC_ARK_ASSET_SERVICE=ark
|
|
VOLC_ARK_ASSET_VERSION=2024-01-01
|
|
VOLC_ARK_ASSET_PROJECT_NAME=default
|
|
REAL_PORTRAIT_PROVIDER_TIMEOUT_MS=15000
|
|
# Entry 套餐物理上限为 50/50;普通调度只使用 45/45,保留 5 个恢复缓冲位。
|
|
REAL_PORTRAIT_GROUP_SOFT_LIMIT=45
|
|
REAL_PORTRAIT_ASSET_SOFT_LIMIT=45
|
|
REAL_PORTRAIT_INVITE_TTL_SECONDS=1800
|
|
# 用于加密 BytedToken 等认证会话秘密;启用 volcengine 时必须至少 32 个字符。
|
|
REAL_PORTRAIT_TOKEN_ENCRYPTION_KEY=
|
|
# 以下四项必须由运营方按真实法律主体填写;不得使用账号昵称或示例占位值。
|
|
REAL_PORTRAIT_CONTROLLER_NAME=
|
|
REAL_PORTRAIT_PROCESSOR_NAME=
|
|
REAL_PORTRAIT_PRIVACY_CONTACT=
|
|
REAL_PORTRAIT_PRIVACY_POLICY_URL=
|
|
|
|
# AI Studio 提示词向导使用火山方舟。专用 Key 留空时复用 ARK_API_KEY;密钥只允许进入 API/worker 环境,禁止使用 VITE_ 前缀或发送到浏览器。
|
|
ARK_PROMPT_WIZARD_API_KEY=
|
|
# 固定正式版本,不允许 latest 或其他模型别名。
|
|
ARK_PROMPT_WIZARD_MODEL=doubao-seed-2-0-lite-260428
|
|
# 单次 HTTP 尝试、单个请求(含退避)和整个方案批次的硬预算。
|
|
PROMPT_WIZARD_TIMEOUT_MS=120000
|
|
PROMPT_WIZARD_REQUEST_BUDGET_MS=180000
|
|
PROMPT_WIZARD_BATCH_BUDGET_MS=240000
|
|
# MAX_RETRIES 是首次请求之外的额外次数:1 表示最多共 2 次尝试。
|
|
PROMPT_WIZARD_MAX_RETRIES=1
|
|
PROMPT_WIZARD_RETRY_BASE_DELAY_MS=1000
|
|
PROMPT_WIZARD_RETRY_MAX_DELAY_MS=8000
|
|
# 单个 worker 与 BullMQ 全局同时处理的提示词向导任务上限;双方案首轮每个脚本批次并发 2 个方舟请求。
|
|
PROMPT_WIZARD_QUEUE_CONCURRENCY=10
|
|
# 单个 Node 进程共享的方舟 Responses HTTP/SSE 在途请求上限。
|
|
PROMPT_WIZARD_PROVIDER_CONCURRENCY=30
|
|
|
|
# 火山费用中心只读同步。余额、账单和资源包只用于成本核算,不参与生成扣费。
|
|
VOLC_BILLING_ACCESS_KEY_ID=
|
|
VOLC_BILLING_SECRET_ACCESS_KEY=
|
|
VOLC_BILLING_ENDPOINT=https://open.volcengineapi.com
|
|
VOLC_BILLING_REGION=cn-north-1
|
|
VOLC_BILLING_SERVICE=billing
|
|
VOLC_BILLING_VERSION=2022-01-01
|
|
VOLC_BILLING_SYNC_TTL_MS=600000
|
|
VOLC_BILLING_BALANCE_SYNC_INTERVAL_MS=300000
|
|
VOLC_BILLING_BILL_SYNC_INTERVAL_MS=600000
|
|
VOLC_BILLING_REQUEST_POLL_INTERVAL_MS=5000
|
|
VOLC_BILLING_REQUEST_TIMEOUT_MS=10000
|
|
VOLC_BILLING_MAX_RETRIES=4
|
|
VOLC_BILLING_RETRY_BASE_DELAY_MS=500
|
|
# ListBillDetail 限制 5 QPS;分页之间默认留出 250ms。
|
|
VOLC_BILLING_PAGE_DELAY_MS=250
|
|
# 账单同步数据保留(天)。worker 每天分批清理:被更新同步完整取代的 run_items、
|
|
# 连续重复的资源包快照、没有任何引用的同步运行记录;最近 N 天内的历史 asOf 报表逐行不变。
|
|
VOLC_BILLING_RUN_ITEMS_RETENTION_DAYS=30
|
|
VOLC_BILLING_PACKAGE_SNAPSHOTS_RETENTION_DAYS=30
|
|
VOLC_BILLING_SYNC_RUNS_RETENTION_DAYS=90
|
|
VOLC_BILLING_RETENTION_SWEEP_INTERVAL_MS=86400000
|
|
VOLC_BILLING_RETENTION_BATCH_SIZE=5000
|
|
|
|
# 支付通道 API 密钥使用此主密钥加密入库;必须是 32 字节随机值的 Base64 编码。
|
|
PAYMENT_CONFIG_ENCRYPTION_KEY=
|
|
PAYMENT_REQUEST_TIMEOUT_MS=10000
|
|
PAYMENT_ORDER_EXPIRES_SECONDS=7200
|
|
PAYMENT_EXPIRY_SWEEP_INTERVAL_MS=60000
|
|
|
|
# Resend 事务邮件。未配置时邮件会跳过并记录通知事件。
|
|
RESEND_API_KEY=
|
|
RESEND_FROM="Your Brand <noreply@example.com>"
|
|
RESEND_NOTIFY_TO=
|
|
RESEND_BLOCKED_TO=
|
|
|
|
# 只供 `npm run db:bootstrap-admin` 的一次性管理员初始化使用。
|
|
# 不要把这些变量传给长期运行的 API/worker;不会提升已有普通用户。
|
|
BOOTSTRAP_ADMIN_EMAIL=
|
|
BOOTSTRAP_ADMIN_PASSWORD=
|
|
BOOTSTRAP_RESET_ADMIN_PASSWORD=false
|
|
|
|
QUEUE_CONCURRENCY=2
|
|
MEDIA_COMMAND_TIMEOUT_MS=60000
|
|
MEDIA_COMMAND_MAX_OUTPUT_BYTES=33554432
|
|
THUMBNAIL_IMAGE_CONCURRENCY=2
|
|
THUMBNAIL_VIDEO_CONCURRENCY=1
|
|
THUMBNAIL_TEMP_ROOT=/tmp/lindyson-thumbnails
|
|
THUMBNAIL_TEMP_MAX_AGE_MS=3600000
|
|
THUMBNAIL_SWEEP_INTERVAL_MS=900000
|
|
# 仅开发/测试可显式开启;生产环境即使设为 true 也会拒绝使用。
|
|
ENABLE_FAKE_PROVIDER=true
|
|
FAKE_PROVIDER_DELAY_MS=1500
|
|
|
|
# 百度普通收录。仅供手动执行 npm run seo:baidu:submit,不注入 API 或 worker。
|
|
BAIDU_SITE_URL=https://www.example.com
|
|
BAIDU_PUSH_TOKEN=
|
|
# 默认优先读取 dist/sitemap.xml,不存在时读取 public/sitemap.xml。
|
|
BAIDU_SITEMAP_PATH=
|
|
|
|
# ChatGPT MCP:默认关闭,启用前配置同源公网地址和独立随机密钥,详见 MCP_CHATGPT.md。
|
|
MCP_ENABLED=false
|
|
MCP_PUBLIC_URL=
|
|
MCP_OAUTH_SECRET=
|
|
MCP_OAUTH_JWKS_JSON=
|
|
MCP_FILE_ENCRYPTION_KEY=
|
|
MCP_READ_RATE_PER_MINUTE=60
|
|
MCP_GENERATE_RATE_PER_MINUTE=6
|
|
MCP_IMPORT_USER_CONCURRENCY=2
|
|
MCP_IMPORT_GLOBAL_CONCURRENCY=4
|
|
|
|
# 前端构建期变量(Vite,只有 VITE_ 前缀会打进网页)。本地可写在 .env.local(git 忽略)。
|
|
# 正式站点地址:canonical、社交分享图与结构化数据使用;带协议、无路径。
|
|
VITE_PUBLIC_SITE_URL=https://www.example.com
|
|
# 客服二维码图片地址,例如放在 public/support-qr.png 后填 /support-qr.png;留空则不显示扫码区域。
|
|
VITE_SUPPORT_QR_URL=
|
|
# API 地址(留空表示同源 /api)。
|
|
VITE_API_BASE_URL=
|
|
# Seedream 交互编辑教程的演示媒体目录(火山引擎官方素材,不随仓库分发);留空时弹窗只显示文字说明与官方链接。
|
|
VITE_SEEDREAM_TUTORIAL_MEDIA_BASE_URL=
|
|
|
|
# ---- docker compose 单机部署专用(本地 npm run dev 不读这些)----
|
|
# 数据库口令;compose 会把它拼进 DATABASE_URL。
|
|
POSTGRES_PASSWORD=change-me
|
|
# web 容器对外端口(http)。要 HTTPS 就在前面放 Caddy / nginx,或把 WEB_HTTP_PORT 改成内网端口再反代。
|
|
WEB_HTTP_PORT=80
|
|
# API 在宿主机上的调试端口,只绑定 127.0.0.1;通常不用改。
|
|
API_HOST_PORT=4300
|