Formbricks 6.1.2 配置参数详解

Formbricks 6.1.2 全量环境变量详解:必填密钥体系、认证开关、SMTP/S3/OAuth/SSO、BullMQ 后台任务、Hub/Cube/SpiceDB 授权链路分组梳理,附内网部署生产模板与实测排障。

FormbricksFormbricks自托管问卷调查2026/10/28

Formbricks 6.1.2 配置参数详解

目标:系统梳理 Formbricks 6.1.2 自托管配置的全部环境变量——必填项、认证开关、邮件、对象存储、OAuth/SSO、集成、观测、后台任务与授权链路,并给出可直接落地的生产配置模板与密钥轮换、SMTP 缺失等实测排障结论。参数清单依据官方 environment-variables 文档(查询日期 2026-10-28)并与 6.1.2 实测环境逐项核对;部署过程见 《Formbricks Docker Compose 部署实战》。

一、环境信息

项目值
Formbricks 版本6.1.2(官方 latest 镜像实测 package.json 版本)
部署形态官方 Docker Compose 编排(多服务基线栈)
配置载体部署目录下的 .env 文件(编排 env_file 注入各服务)
实测服务器Ubuntu 22.04,Web 入口 http://192.168.146.128:8129
官方文档基准formbricks.com/docs/self-hosting/configuration/environment-variables(2026-10-28 查询)

二、前置条件

  1. 已按部署篇完成 6.1.2 全栈部署并能访问管理后台;
  2. 明确 Formbricks 的配置只有两个入口:
    • 环境变量(.env 文件):全部服务端行为(本文主题);
    • 管理后台(组织设置/问卷设置):运行时业务配置,落库而非落文件;
  3. 准备好密钥生成手段(openssl rand -hex 32,Ubuntu 自带)。

三、参数查看与修改方式

3.1 修改流程

Formbricks 的环境变量在服务启动时读取,修改 .env 后必须重建服务进程才生效:

$ cd /opt/formbricks/docker
$ vi .env
$ docker compose up -d          # 编排引擎按变量归属重建受影响服务
 Container formbricks-6.1.2-app Starting
 Container formbricks-6.1.2-app Started

改完先做校验再应用(缺必填变量会在此处报错而非启动失败):

$ docker compose config --quiet && echo OK
OK

⚠️ 注意:POSTGRES_PASSWORD 例外——它随数据卷首次初始化固化,之后修改只会导致应用连不上库(详见部署篇 10.2)。

3.2 变量生效范围的三层结构

官方编排把变量分给不同服务消费,改动前先确认归属,避免"改了没生效":

  1. 仅主应用消费:WEBAPP_URL、认证开关、OAuth、邮件等(compose 文件 x-environment 段注入 formbricks 服务);
  2. 主应用 + Hub 共享:DATABASE_URL、HUB_*、TAXONOMY_*;
  3. 独立服务自有:SpiceDB 的 SPICEDB_*(由 AUTHZED_* 变量映射)、Cube 的 CUBEJS_*。

编排文件中有一个值得注意的细节:TAXONOMY_SERVICE_TOKEN、HUB_INTERNAL_API_TOKEN 等变量在共享段被显式置空(官方注释:避免共享 .env 把它们泄进 Web 应用进程),它们只通过专用路径注入 Hub/taxonomy 服务。

四、参数总览

下表为 6.1.2 全部配置变量的分组索引(默认值以官方文档与编排文件为准):

分组代表变量必填性
核心运行WEBAPP_URL、DATABASE_URL、BETTER_AUTH_SECRET、ENCRYPTION_KEY、CRON_SECRET、REDIS_URL必填
认证基址BETTER_AUTH_URL(legacy:NEXTAUTH_URL/NEXTAUTH_SECRET)必填
注册与访问开关EMAIL_VERIFICATION_DISABLED、PASSWORD_RESET_DISABLED、EMAIL_AUTH_DISABLED、INVITE_DISABLED、SESSION_MAX_AGE可选
SMTP 邮件SMTP_HOST/PORT/USER/PASSWORD、MAIL_FROM、SMTP_SECURE_ENABLED 等可选
对象存储S3_ACCESS_KEY/SECRET_KEY/REGION/BUCKET_NAME/ENDPOINT_URL/FORCE_PATH_STYLE可选
OAuth/SSOGITHUB_ID/SECRET、GOOGLE_CLIENT_ID/SECRET、AZUREAD_*、OIDC_*、SAML_DATABASE_URL可选
机器人防护TURNSTILE_SITE_KEY/SECRET_KEY、RECAPTCHA_*(EE)可选
第三方集成NOTION_OAUTH_*、GOOGLE_SHEETS_*、AIRTABLE_CLIENT_ID、SLACK_CLIENT_ID/SECRET、STRIPE_*可选
观测与遥测SENTRY_DSN、OTEL_*、PROMETHEUS_ENABLED、TELEMETRY_DISABLED、LOG_LEVEL可选
后台任务BULLMQ_WORKER_ENABLED/COUNT/CONCURRENCY、BULLMQ_EXTERNAL_WORKER_ENABLED可选
审计日志AUDIT_LOG_ENABLED、AUDIT_LOG_GET_USER_IP可选
Hub/Cube/授权链路HUB_API_KEY/URL、CUBEJS_*、AUTHZED_*编排必填
AI 能力AI_PROVIDER、AI_MODEL、AI_AZURE_*、AI_OPENAI_COMPATIBLE_*可选
企业版ENTERPRISE_LICENSE_KEYEE 必填
其他DEFAULT_BRAND_COLOR、UNSPLASH_ACCESS_KEY、PRIVACY_URL/TERMS_URL/IMPRINT_*、USER_MANAGEMENT_MINIMUM_ROLE、RATE_LIMITING_DISABLED可选

关键差异提示:必填项集中在"核心运行 + 认证基址"两组(部署篇第六章已给全量 12 项);其余分组都是"不配就关闭对应能力"的开关型配置,可按需渐进启用。

五、核心参数分类详解

5.1 核心运行参数

WEBAPP_URL(默认 http://localhost:3000) 对外的应用基准地址,链接问卷 URL、邮件跳转、Webhook 回调里的链接全部由它生成。必须写成用户浏览器实际能访问的地址(含端口)。实测环境为 http://192.168.146.128:8129。

BETTER_AUTH_URL(与 WEBAPP_URL 保持一致) 认证体系(Better Auth)的基准地址,浏览器会话 Cookie 的域、登录 Origin 校验都依据它。实测结论:浏览器从与该值不符的地址访问时登录返回 403:

{"message":"Invalid origin","code":"INVALID_ORIGIN"}
HTTP:403

legacy 别名:NEXTAUTH_URL 与 NEXTAUTH_SECRET v5 认证体系从 NextAuth 迁移到 Better Auth 后,这两个 v4 时代的老变量被保留为别名(官方编排注释原文:旧实例升级后沿用原值,"nothing rewrites it, so this key stays supported indefinitely")。新部署直接用 BETTER_AUTH_*;BETTER_AUTH_SECRET 未设置时会回退读取 NEXTAUTH_SECRET。

DATABASE_URL(必填) PostgreSQL 连接串。编排中由 POSTGRES_PASSWORD(_URL_ENCODED) 拼接生成,官方形态:

DATABASE_URL=postgresql://postgres:<口令>@postgres:5432/formbricks?schema=public

外置数据库时把主机名与凭据换成真实值即可;schema=public 参数固定保留。

ENCRYPTION_KEY(必填,openssl rand -hex 32 生成) 数据加密密钥,覆盖三类数据:双因素认证密钥、链接问卷的单次链接签名、审计日志哈希。一旦有数据写入,轮换即意味着旧密文不可解——官方没有提供密钥迁移工具,务必妥善保存。

CRON_SECRET(必填) 内部定时任务的调用口令(响应清理、会话清理等周期任务经 HTTP 触发时校验)。

REDIS_URL(官方文档标注必填,默认 redis://localhost:6379) 缓存/限流/审计/BullMQ 队列的连接地址。官方编排固定 redis://redis:6379(内网服务名)。官方文档明确:未配置 Redis 直接启动会报错退出,不能裸跑无 Redis 的实例。

💡 技术拓展:会话与队列的"Redis 还是数据库"之争——Better Auth 的会话令牌存 Redis(读写快、自动过期),BullMQ 的后台任务队列也依赖 Redis 的列表与阻塞弹出;若只用 PostgreSQL 承载这两类数据,高频轮询会把数据库打满。业界同类平台(如开源电邮列表、任务队列系统)普遍采用"Redis 管热数据 + PostgreSQL 管冷数据"的分工。Formbricks v6 选择了 Redis 必配路线,本文实测沿用编排内置 Valkey(Redis 兼容实现)。

LOG_LEVEL(默认 info,可选 debug/info/warn/error/fatal) 应用日志级别;排障时临时调到 debug,观测噪音大时调 warn。

5.2 注册与访问控制开关

变量默认说明
EMAIL_VERIFICATION_DISABLED1设 0 开启注册邮箱验证(需先配好 SMTP)
PASSWORD_RESET_DISABLED1设 0 开启忘记密码邮件(需 SMTP)
PASSWORD_HIBP_CHECK_DISABLED未设密码修改时对 pwnedpasswords.com 的外呼校验;离线内网部署建议设 1 跳过
EMAIL_AUTH_DISABLED未设设 1 禁用邮箱密码登录(纯 SSO 场景用)
INVITE_DISABLED未设设 1 关闭成员邀请
INVITE_RATE_LIMIT_PER_24_HOURS50每组织 24 小时邀请上限
SESSION_MAX_AGE86400会话有效期(秒),默认 24 小时
AUTH_SKIP_INVITE_FOR_SSO未设设 1 允许 SSO 新用户免邀请直接注册
AUTH_SSO_DEFAULT_ORGANIZATION_ID / AUTH_SSO_DEFAULT_ORGANIZATION_ROLE未设SSO 新用户自动归入的组织与角色(owner/manager/member/billing,默认 manager;v6 由 DEFAULT_ORGANIZATION_* 更名)
AUTH_SSO_DEFAULT_TEAM_ID未设SSO 新用户自动加入的团队
USER_MANAGEMENT_MINIMUM_ROLEmanager后台用户管理功能的最低角色门槛(owner/manager/disabled)

5.3 SMTP 邮件参数

变量默认说明
SMTP_HOST / SMTP_PORT未设服务器与端口(25/465/587 按服务商要求)
SMTP_USER / SMTP_PASSWORD未设认证凭据
SMTP_AUTHENTICATED1是否启用 SMTP 认证
SMTP_SECURE_ENABLED未设1 = 直连 TLS(465 口);587 STARTTLS 保持不设
SMTP_REJECT_UNAUTHORIZED_TLS1证书校验开关;官方建议私有 CA 用 NODE_EXTRA_CA_CERTS 挂证书而非设 0
MAIL_FROM / MAIL_FROM_NAME未设发件人地址与显示名

未配 SMTP 时保持 EMAIL_VERIFICATION_DISABLED=1、PASSWORD_RESET_DISABLED=1,否则用户会卡在"验证邮件发不出去"。

5.4 对象存储(S3)参数

变量默认说明
S3_BUCKET_NAME未设设了即启用 S3;不设则上传文件落本地磁盘
S3_ACCESS_KEY / S3_SECRET_KEY未设访问凭据
S3_REGION未设区域(AWS 必填)
S3_ENDPOINT_URL未设兼容 S3 的第三方端点(StorJ、MinIO 等)
S3_FORCE_PATH_STYLE0MinIO/RustFS 等路径风格端点需设 1

💡 技术拓展:对象存储的两种寻址风格——虚拟主机式(bucket.s3.amazonaws.com,DNS 解析桶名)与路径式(endpoint/bucket,桶在路径里)。AWS S3 原生用前者;自建 MinIO 通常没有通配符 DNS,必须用路径式(即 S3_FORCE_PATH_STYLE=1)。本文实测未启用 S3(单机磁盘存储),多副本部署建议外置 S3/MinIO。

5.5 OAuth 与企业 SSO

变量说明
GITHUB_ID / GITHUB_SECRETGitHub OAuth 登录
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogle OAuth 登录
AZUREAD_CLIENT_ID/SECRET/TENANT_IDAzure AD 登录
OIDC_CLIENT_ID/SECRET/ISSUER/DISPLAY_NAME/SIGNING_ALGORITHM通用 OIDC 接入
SAML_DATABASE_URLSAML 连接配置库(企业版;独立 PostgreSQL 库存放 SAML 元数据)
TURNSTILE_SITE_KEY/SECRET_KEYCloudflare Turnstile(注册防机器人)
RECAPTCHA_SITE_KEY/SECRET_KEYreCAPTCHA v3(问卷响应防机器人,企业版)

5.6 第三方集成

变量对应集成
NOTION_OAUTH_CLIENT_ID/SECRETNotion
GOOGLE_SHEETS_CLIENT_ID/SECRET/REDIRECT_URLGoogle Sheets
AIRTABLE_CLIENT_IDAirtable
SLACK_CLIENT_ID/SECRETSlack
STRIPE_SECRET_KEY / STRIPE_WEBHOOK_SECRETStripe(云版计费,自托管一般不配)

5.7 观测、遥测与限流

变量默认说明
LOG_LEVELinfo见 5.1
SENTRY_DSN / SENTRY_AUTH_TOKEN / SENTRY_ENVIRONMENT未设Sentry 错误上报
OTEL_EXPORTER_OTLP_ENDPOINT / OTEL_EXPORTER_OTLP_PROTOCOL / OTEL_SERVICE_NAME未设OpenTelemetry 上报(http/protobuf 等)
OTEL_TRACES_SAMPLER / OTEL_TRACES_SAMPLER_ARG未设采样策略(如 parentbased_traceidratio + 1)
OTEL_LOGS_ENABLED未设1 时 Pino 日志也走 OTLP
PROMETHEUS_ENABLED未设1 开启 Prometheus 指标
PROMETHEUS_EXPORTER_PORT9090指标端口
TELEMETRY_DISABLED未设1 关闭匿名遥测(企业版激活后强制忽略遥测开关)
RATE_LIMITING_DISABLED未设1 全局关闭限流(仅排障用)

5.8 后台任务(BullMQ)

变量默认说明
BULLMQ_WORKER_ENABLED1应用内置 worker 开关
BULLMQ_WORKER_COUNT1worker 进程数
BULLMQ_WORKER_CONCURRENCY1单 worker 并发
BULLMQ_EXTERNAL_WORKER_ENABLED0使用外部 worker 进程时开启,配合应用内 worker 关闭做扩容

5.9 审计日志

变量默认说明
AUDIT_LOG_ENABLED01 开启(依赖 Redis)
AUDIT_LOG_GET_USER_IP01 时从请求头取用户 IP 记入审计

5.10 Hub / Cube / SpiceDB 授权链路

变量默认说明
HUB_API_KEY编排必填Hub 内部 API 密钥
HUB_API_URLhttp://hub:8080Hub 服务地址(外置 Hub 时改)
HUB_DATABASE_URL默认与主库同库Hub 独立数据库时设置
CUBEJS_API_URLhttp://cube:4000Cube 语义层地址
CUBEJS_API_SECRET编排必填Cube 访问密钥
CUBEJS_JWT_ISSUER / CUBEJS_JWT_AUDIENCEformbricks-web / formbricks-cubeCube JWT 双向校验对
AUTHZED_ENABLEDtrueSpiceDB 授权开关
AUTHZED_ENDPOINTspicedb:50051SpiceDB gRPC 地址
AUTHZED_TOKEN编排必填gRPC 预共享密钥
AUTHZED_SYSTEM_KEYformbricksSpiceDB 权限系统前缀
AUTHZED_INSECUREtrue编排内网明文 gRPC(外置时配 TLS 并设 false)
AUTHZED_CONSISTENCYfully_consistent授权查询一致性(高负载可降为 minimize_latency)

5.11 AI 与企业版

  • AI_PROVIDER:aws / google / azure / openai-compatible 四选一,配套 AI_MODEL 与各厂商密钥变量(AI_AZURE_*、AI_GOOGLE_CLOUD_*、AI_AWS_*、AI_OPENAI_COMPATIBLE_*),用于响应的 AI 洞察;
  • ENTERPRISE_LICENSE_KEY:企业版许可(Beta 期可向官方免费申请),激活需能访问许可证服务器(或配 HTTP(S)_PROXY);
  • DEFAULT_BRAND_COLOR(默认 #64748b)、UNSPLASH_ACCESS_KEY(问卷背景图)、PRIVACY_URL/TERMS_URL/IMPRINT_URL/IMPRINT_ADDRESS(合规页脚)属于界面与合规杂项。

六、生产配置模板

按"小团队内网部署(≤100 人使用,无外发邮件需求)"场景给出精简模板(密钥值请全部重新生成):

# ---- 基址(两项必须一致,换成真实 IP/域名) ----
WEBAPP_URL=http://192.168.146.128:8129
BETTER_AUTH_URL=http://192.168.146.128:8129
# ---- 数据库(初始化后 PASSWORD 不可改) ----
POSTGRES_PASSWORD=<openssl rand -hex 32 生成>
POSTGRES_PASSWORD_URL_ENCODED=<同上,含特殊字符时 URL 编码>
# ---- 密钥四件套(各自独立生成) ----
BETTER_AUTH_SECRET=<openssl rand -hex 32 生成>
ENCRYPTION_KEY=<openssl rand -hex 32 生成>
CRON_SECRET=<openssl rand -hex 32 生成>
HUB_API_KEY=<openssl rand -hex 32 生成>
# ---- 分析与授权链路 ----
CUBEJS_API_SECRET=<openssl rand -hex 32 生成>
CUBEJS_JWT_ISSUER=formbricks-web
CUBEJS_JWT_AUDIENCE=formbricks-cube
AUTHZED_TOKEN=<openssl rand -hex 32 生成>
AUTHZED_DATABASE_PASSWORD=<openssl rand -hex 32 生成>
# ---- 内网无邮件时保持关闭 ----
EMAIL_VERIFICATION_DISABLED=1
PASSWORD_RESET_DISABLED=1
# ---- 离线内网跳过密码外呼校验 ----
PASSWORD_HIBP_CHECK_DISABLED=1
# ---- 资源与观测 ----
LOG_LEVEL=info
TELEMETRY_DISABLED=1

容量参考(同环境实测基线):全栈空载内存约 1.3 GB(主应用 665 MB、Cube 253 MB、PostgreSQL 198 MB、SpiceDB 限 512 MB 内实际 121 MB),磁盘需求主要在 PostgreSQL 响应数据与上传文件,建议预留 20 GB 起。启用邮件、SSO 或 S3 时按第五章对应小节追加变量即可。

七、常见问题(实测排障)

7.1 改了 .env 但行为没变化

三层排查:① 变量归属的服务是否被重建(docker compose up -d 只重建配置变化的服务,确认输出里有对应服务名);② 变量是否属于一次性任务消费(如 AUTHZED_DATABASE_PASSWORD 属 SpiceDB 库账号,应用侧改了无效);③ 是否撞上"不可变变量"(POSTGRES_PASSWORD 随卷固化)。

7.2 登录 403 INVALID_ORIGIN

浏览器访问地址与 BETTER_AUTH_URL 不一致所致,实测回显与处理见部署篇 10.3:两处地址成对修改后 docker compose up -d formbricks。

7.3 轮换 BETTER_AUTH_SECRET 后全员被登出

预期行为:会话 Cookie 由该密钥签名,更换即全部失效;API Key 不受影响。轮换应选低峰期并提前告知用户重新登录(实测结论,见部署篇 10.4)。

7.4 内网 Webhook 无法保存/不推送

默认 SSRF 防护拦截内网目标;测试环境加 DANGEROUSLY_ALLOW_WEBHOOK_INTERNAL_URLS=1(实测可用),生产环境应改用公网可达的接收端。

7.5 密码登录时卡顿或超时

PASSWORD_HIBP_CHECK_DISABLED 未设置时,密码修改路径会对 pwnedpasswords.com 做外呼校验;离线/内网环境设 1 即可(本文生产模板已含)。

八、参考链接