Configuration

环境变量

Nebutra-Sailor 中所有环境变量的完整参考——必填级别、默认值和服务说明。

验证机制

所有变量在启动时由 @nebutra/config 进行验证(packages/platform/config/src/index.ts)。缺失或为空的必填变量会导致立即退出,并输出描述性错误信息。缺失的可选变量将使用文档中记录的默认值。

NEXT_PUBLIC_ 为前缀的变量会被打包进客户端 JavaScript 中,对终端用户可见。切勿在 NEXT_PUBLIC_ 变量中存放密钥。


数据库

变量是否必填默认值说明
DATABASE_URL完整的 PostgreSQL 连接字符串。格式:postgresql://user:pass@host:5432/nebutra
DATABASE_URL=postgresql://postgres:password@localhost:5432/nebutra

在本地开发中,pnpm infra:up 会在端口 5432 上启动 PostgreSQL 16 实例,用户名为 postgres,密码为 password


身份验证

变量是否必填默认值说明
AUTH_PROVIDERbetter-auth服务端认证提供商。可选:better-authnextauthclerksupabasedev
NEXT_PUBLIC_AUTH_PROVIDERbetter-auth客户端可见的认证提供商。应与 AUTH_PROVIDER 保持一致。
BETTER_AUTH_SECRETAUTH_PROVIDER=better-authBetter Auth 自托管签名密钥。可用 openssl rand -base64 32 生成。auth 与各 RP 必须一致
BETTER_AUTH_URLAUTH_PROVIDER=better-auth提供 /api/auth/* 的登录中心源站。生产:https://auth.nebutra.com
NEXT_PUBLIC_AUTH_URL拆分登录中心时客户端跳转 / SDK baseURL 使用的登录中心 URL,通常与 BETTER_AUTH_URL 相同。
AUTH_COOKIE_DOMAIN多子域生产共享 Cookie 父域(如 .nebutra.com),使 appauth 共享会话。
SERVICE_SECRET是(网关 / S2S)内部 x-service-token HS256 JWT 密钥。不是终端用户会话密钥。
AUTH_SECRETAUTH_PROVIDER=nextauthAuth.js / NextAuth 签名密钥。可用 openssl rand -base64 32 生成。
NEXTAUTH_URLAUTH_PROVIDER=nextauthAuth.js 回调使用的控制台源站。
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYAUTH_PROVIDER=clerkClerk 可发布密钥。以 pk_live_pk_test_ 开头。
CLERK_SECRET_KEYAUTH_PROVIDER=clerkClerk 密钥。以 sk_live_sk_test_ 开头。
CLERK_WEBHOOK_SECRET启用 Clerk Webhook 时Clerk Webhook 载荷的签名密钥。以 whsec_ 开头。
AUTH_SSO_DISCOVERY_PROVIDERS启用企业 SSO 发现时将邮箱域名映射到 SSO provider 的 JSON 数组。Clerk 条目使用 /sign-in/sso;Feishu 条目使用 /api/auth/oauth/feishu;generic 条目必须定义内部 loginUrl
FEISHU_APP_ID启用飞书/Lark SSO 时Better Auth generic OAuth 使用的飞书/Lark App ID。
FEISHU_APP_SECRET启用飞书/Lark SSO 时飞书/Lark App Secret。切勿暴露为 NEXT_PUBLIC_
FEISHU_OAUTH_SCOPEScontact:user.email contact:user.base:readonly向飞书/Lark 请求的 OAuth scope,支持空格或逗号分隔。
FEISHU_ALLOWED_TENANT_KEYS可选的飞书 tenant key 白名单,用于限制本部署接受的租户。
FEISHU_REDIRECT_URI可选覆盖。Better Auth 默认回调为 /api/auth/oauth2/callback/feishu
GOOGLE_CLIENT_ID启用 Google OAuth 时Better Auth 或 NextAuth 使用的 Google OAuth Web Client ID。
GOOGLE_CLIENT_SECRET启用 Google OAuth 时Better Auth 或 NextAuth 使用的 Google OAuth Web Client Secret。
GITHUB_CLIENT_ID启用 GitHub OAuth 时Better Auth 使用的 GitHub OAuth App Client ID。
GITHUB_CLIENT_SECRET启用 GitHub OAuth 时GitHub OAuth App Client Secret。
NEXT_PUBLIC_GOOGLE_CLIENT_IDBetter Auth 或 NextAuth 启用 Google One Tap 时Landing 页 One Tap 提示使用的公开 Google OAuth Web Client ID。
NEXT_PUBLIC_ENABLE_GOOGLE_ONE_TAPtrue设置为 false 可关闭 Landing 页 One Tap 提示。
NEXT_PUBLIC_TURNSTILE_SITE_KEY展示 Turnstile 时登录中心表单使用的 Cloudflare Turnstile site key。
TURNSTILE_SECRET_KEY / TURNSTILE_SECRET强制 Turnstile 时siteverify 服务端密钥。未配置时跳过校验。
NEXT_PUBLIC_AUTH_MAGIC_LINK关闭设为 1 / true 时在登录中心展示魔法链接入口。
NEXT_PUBLIC_AUTH_PASSKEYS关闭设为 1 / true 时展示 Passkey 按钮与条件 UI。
PASSKEY_RP_IDauth 主机名WebAuthn RP ID 覆盖(默认登录中心主机)。
PASSKEY_ORIGINauth 源站WebAuthn origin 覆盖(默认登录中心源站)。
NEBUTRA_LANDING_ORIGINNextAuth One Tap 启用时允许 POST 到 /api/auth/google-one-tap 的 Landing 源站。
NEBUTRA_SESSION_HINT_DOMAIN可选的跨子域轻量会话提示 Cookie 域。
AUTH_PROVIDER=better-auth
NEXT_PUBLIC_AUTH_PROVIDER=better-auth
BETTER_AUTH_SECRET=local-dev-secret
BETTER_AUTH_URL=http://localhost:3101
NEXT_PUBLIC_AUTH_URL=http://localhost:3101
GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=xxx
NEXT_PUBLIC_GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
AUTH_PROVIDER=better-auth
NEXT_PUBLIC_AUTH_PROVIDER=better-auth
BETTER_AUTH_SECRET=...                 # apps/auth 与 apps/web 相同
BETTER_AUTH_URL=https://auth.nebutra.com
NEXT_PUBLIC_AUTH_URL=https://auth.nebutra.com
AUTH_COOKIE_DOMAIN=.nebutra.com
DATABASE_URL=postgresql://...
SERVICE_SECRET=...
GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=xxx
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...
NEXT_PUBLIC_TURNSTILE_SITE_KEY=0x4AAAAA...
TURNSTILE_SECRET_KEY=0x4AAAAA...
# 可选 UX 开关:
# NEXT_PUBLIC_AUTH_MAGIC_LINK=1
# NEXT_PUBLIC_AUTH_PASSKEYS=1
# PASSKEY_RP_ID=auth.nebutra.com
# PASSKEY_ORIGIN=https://auth.nebutra.com
AUTH_PROVIDER=clerk
NEXT_PUBLIC_AUTH_PROVIDER=clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxx
CLERK_SECRET_KEY=sk_live_xxx
CLERK_WEBHOOK_SECRET=whsec_xxx
AUTH_PROVIDER=better-auth
NEXT_PUBLIC_AUTH_PROVIDER=better-auth
BETTER_AUTH_SECRET=...
BETTER_AUTH_URL=https://auth.nebutra.com
NEXT_PUBLIC_AUTH_URL=https://auth.nebutra.com
AUTH_COOKIE_DOMAIN=.nebutra.com
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=xxx
FEISHU_OAUTH_SCOPES="contact:user.email contact:user.base:readonly"
AUTH_SSO_DISCOVERY_PROVIDERS='[{"domain":"example.cn","id":"example-feishu","name":"Example Feishu","type":"oidc","provider":"feishu"}]'

OAuth 回调 URI 必须指向登录中心源站,例如 https://auth.nebutra.com/api/auth/callback/googlehttps://auth.nebutra.com/api/auth/callback/githubGET https://auth.nebutra.com/health 会返回当前启用的 oauth.callbackUrls


应用 URL

变量是否必填默认值说明
NEXT_PUBLIC_APP_URL已认证控制台的基础 URL。示例:https://app.nebutra.com
NEXT_PUBLIC_API_URLAPI 网关的基础 URL。示例:https://api.nebutra.com

支付(Stripe)

变量是否必填默认值说明
STRIPE_SECRET_KEYStripe 密钥。以 sk_live_sk_test_ 开头。
STRIPE_WEBHOOK_SECRETStripe Webhook 载荷的签名密钥。以 whsec_ 开头。
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYStripe 可发布密钥。以 pk_live_pk_test_ 开头。
STRIPE_PRO_PRICE_IDPro 计划的 Stripe Price ID。以 price_ 开头。
STRIPE_ENTERPRISE_PRICE_IDEnterprise 计划的 Stripe Price ID。以 price_ 开头。

在开发和预览环境中请使用测试模式密钥(sk_test_pk_test_)。切勿在生产环境之外使用正式模式密钥。


邮件(Resend)

变量是否必填默认值说明
RESEND_API_KEYResend API 密钥。以 re_ 开头。
EMAIL_FROM所有事务性邮件显示的发件人地址。示例:Nebutra <[email protected]>

存储

变量是否必填默认值说明
STORAGE_PROVIDERlocal存储后端。可选值:s3r2s3-compatiblelocal
AWS_BUCKET_NAMEnebutra-uploadsS3 或 R2 存储桶名称。
AWS_REGIONus-east-1S3 的 AWS 区域。
AWS_ACCESS_KEY_IDAWS Access Key ID。
AWS_SECRET_ACCESS_KEYAWS Secret Access Key。

STORAGE_PROVIDERlocal 时,上传的文件写入服务器文件系统的 ./uploads 目录。这仅适用于本地开发——本地存储在部署间不会持久化。


AI

变量是否必填默认值说明
OPENAI_API_KEYOpenAI API 密钥。当 FEATURE_AI_CHAT=trueFEATURE_AI_EMBEDDINGS=true 时必填。
OPENROUTER_API_KEYOpenRouter API 密钥。可替代直接访问 OpenAI。
AI_DEFAULT_MODELgpt-5.4-miniAI 补全使用的默认模型标识符。

Redis

变量是否必填默认值说明
REDIS_URLRedis 连接字符串。队列(BullMQ)、缓存和限流必需。示例:redis://localhost:6379

pnpm infra:up 会在端口 6379 上启动 Redis 7。pnpm infra:lite 仅启动 PostgreSQL,不包含 Redis。


分析与可观测性(ClickHouse)

变量是否必填默认值说明
CLICKHOUSE_URLhttp://localhost:8123ClickHouse HTTP 端点。@nebutra/metering 管道必需。
CLICKHOUSE_DBnebutraClickHouse 数据库名称。

错误追踪(Sentry)

变量是否必填默认值说明
SENTRY_DSN服务端错误报告的 Sentry DSN。
NEXT_PUBLIC_SENTRY_DSN客户端错误报告的 Sentry DSN。

产品分析(PostHog)

变量是否必填默认值说明
POSTHOG_KEY服务端产品事件使用的 PostHog 项目 API 密钥,以 phc_ 开头。
POSTHOG_HOSThttps://us.i.posthog.com服务端 PostHog 数据摄入主机。
NEXT_PUBLIC_POSTHOG_KEYPostHog 项目 API 密钥。以 phc_ 开头。
NEXT_PUBLIC_POSTHOG_HOSThttps://app.posthog.comPostHog 数据摄入主机。如使用自托管或 EU 实例,请覆盖此值。

后台任务(Inngest)

变量是否必填默认值说明
INNGEST_EVENT_KEY用于发送事件的 Inngest 事件 API 密钥。
INNGEST_SIGNING_KEY用于 Webhook 验证的 Inngest 签名密钥。

无服务器队列(QStash)

仅当 QUEUE_PROVIDER=qstash 时需要这些变量。若已设置 REDIS_URL 且未设置 QUEUE_PROVIDER,系统会自动选择 BullMQ。

变量是否必填默认值说明
QSTASH_TOKEN条件必填Upstash QStash REST 令牌。
QSTASH_CURRENT_SIGNING_KEY条件必填用于载荷验证的当前 Webhook 签名密钥。
QSTASH_NEXT_SIGNING_KEY条件必填密钥轮换期间使用的下一个签名密钥。
QSTASH_CALLBACK_BASE_URL条件必填QStash 投递 Webhook 回调的公开基础 URL。示例:https://api.nebutra.com

生成密钥

对于需要加密随机值的密钥:

openssl rand -base64 32

每个环境(开发、预览、生产)请使用独立的密钥值,切勿跨环境复用。

相关文档

How is this guide?

目录