Reactive Resume 6.0.8 配置参数详解

Reactive Resume v6.0.8 服务端环境变量逐条详解:必填项、默认值与生效观测,覆盖双域名、存储后端、字体镜像、AI 供应商等配置,「改参 → 重启 → 观测」回路实测验证。

Reactive ResumeReactive ResumeDocker简历PostgreSQL2026/10/30

Reactive Resume 6.0.8 配置参数详解

目标:把 Reactive Resume v6.0.8 服务端可读的每一个环境变量讲清——哪些必填、默认值是什么、改了之后如何观测是否真的生效。本文以 Ubuntu 22.04 + Reactive Resume 6.0.8 + PostgreSQL 18 的实测实例(应用监听 8150 端口,部署过程见《Reactive Resume 6.0.8 部署指南》)为基准,变量清单与默认值逐条对照官方 docs/self-hosting/environment-variables.mdx(查询日期 2026-10-29),「改参 → 重启 → 观测」回路的命令与回显均为实测照抄。

一、环境信息

项目值
操作系统Ubuntu 22.04(x86_64)
应用版本Reactive Resume 6.0.8(/api/health 返回 version: 6.0.8)
数据库PostgreSQL 18
应用监听8150 端口(进程内 3000)
配置文件/opt/reactive-resume/.env(环境变量文件)
观测端点GET /api/health(健康与依赖状态)、GET /api/openapi/flags(能力开关回显)
演示账号admin / q1w2e3r4

Reactive Resume 的配置面是纯环境变量:服务端启动时从进程环境读取全部设置(源码部署形态才额外加载工作区根目录的 .env 文件,且环境变量优先于文件),没有任何管理后台配置页。这意味着所有配置变更都是「改文件 → 重启进程」一个动作链。

二、前置条件

  1. 已按部署指南完成 v6.0.8 实例部署并能打开 GET /api/health(返回 healthy);
  2. 能编辑服务器上的 /opt/reactive-resume/.env 文件;
  3. 会用 openssl rand -hex 32 生成随机密钥(Ubuntu 22.04 自带 openssl);
  4. 了解实例的访问地址(本文 http://localhost:8150,读者按自己的 APP_URL 替换)。

三、参数查看与修改方式

3.1 查看当前生效配置

Reactive Resume 没有「打印全部配置」的调试开关,但提供了一个公开的能力开关回显端点 GET /api/openapi/flags,它把关键配置的解析结果序列化为 JSON,是判断配置是否生效最直接的观测面。实测基线(未做任何可选配置的新实例):

curl -s http://localhost:8150/api/openapi/flags
{"disableSignups":false,"disableEmailAuth":false,"allowGuestLogin":false,"smtpEnabled":false,"careerSchedulingEnabled":true,"appUrl":"http://localhost:8150","customDomains":false,"olacvSuggestion":false}

字段与配置的对应关系:disableSignups ← FLAG_DISABLE_SIGNUPS、disableEmailAuth ← FLAG_DISABLE_EMAIL_AUTH、allowGuestLogin ← FLAG_ENABLE_GUEST_LOGIN、smtpEnabled ← 四项 SMTP_* 是否配齐、appUrl ← APP_URL 原值回显、customDomains ← 自定义域名变量是否设置。健康端点则负责另一类观测——storage.type 会显示当前存储后端(实测 local),配置了 Redis 时会出现 redis 字段。

3.2 修改参数的标准动作

  1. 编辑 /opt/reactive-resume/.env,新增或修改变量行;
  2. 重启应用服务使新环境变量注入(命令见《Reactive Resume 6.0.8 部署指南》第十章;仅重启应用,数据库不动);
  3. 用 GET /api/openapi/flags 或 GET /api/health 观测新值是否生效。

下面用一次完整实测闭环演示(FLAG_ENABLE_GUEST_LOGIN,登录页显示「以来宾身份继续」按钮):

echo 'FLAG_ENABLE_GUEST_LOGIN=true' >> /opt/reactive-resume/.env
# 重建应用服务后观测
curl -s http://localhost:8150/api/openapi/flags
{"disableSignups":false,"disableEmailAuth":false,"allowGuestLogin":true,"smtpEnabled":false,"careerSchedulingEnabled":true,"appUrl":"http://localhost:8150","customDomains":false,"olacvSuggestion":false}

allowGuestLogin 由 false 变 true,配置生效。删除该行、再次重建后实测回到 false——改配置排障时必须做「开与关」两个方向的验证,只测打开方向容易把中间态当最终态。

3.3 值解析规则(官方口径,决定怎么写才有效)

规则说明
环境优先进程环境中已存在的变量永远覆盖 .env 文件中的同名值
空值等于未设置SMTP_HOST="" 与不设置 SMTP_HOST 完全等价
启动时校验缺失或格式非法的变量会让服务拒绝启动并在日志点名变量(下文 5.1 有实测)
布尔值写法true/false,也接受 1/0、yes/no、on/off;其他值直接导致启动失败
修改后重启生效环境变量在进程启动时读取,运行中改 .env 不热生效

3.4 启动校验实测:短密钥会被拒绝

把 AUTH_SECRET 改成 8 字符的 short123 后重建服务,进程直接退出进入重启循环,日志明确点名变量(实测回显):

❌ Invalid environment variables: [
    path: [ 'AUTH_SECRET' ],
    message: 'AUTH_SECRET must be at least 32 characters in production. Generate one with openssl rand -hex 32.'
Error: Invalid environment variables

恢复正确密钥后重建,服务回到 healthy。这条实测说明:生产模式下必填密钥的格式校验是硬门槛,配置错误不会「带病运行」,而是拒绝启动——排障时第一时间看应用日志而不是反复重启。

四、参数总览

按功能域分组的全量参数索引(默认值均为官方文档口径,查询日期 2026-10-29):

功能域参数必填
必填基础APP_URL、DATABASE_URL、AUTH_SECRET是(3 项)
服务与监听PORT、NODE_ENV、SERVER_PORT、ROOT_RESUME_ID否
数据库DATABASE_MIGRATION_URL、DATABASE_POOL_MAX、STRICT_SCHEMA_CHECK否
登录认证4 组社交登录对、7 项自定义 OAuth、BETTER_AUTH_API_KEY、BETTER_AUTH_INTERNAL_URL、OPENAI_APPS_CHALLENGE_TOKEN、3 项移动端关联否
邮件SMTP_HOST、SMTP_PORT、SMTP_USER、SMTP_PASS、SMTP_FROM、SMTP_SECURE否
存储后端STORAGE_BACKEND、LOCAL_STORAGE_PATH、5 项 S3_*、2 项 BLOB_*、STORAGE_HEALTHCHECK_TIMEOUT_MS、DEPLOYMENT_NAMESPACE否
AI 与 RedisENCRYPTION_SECRET、AI_PROVIDER、AI_MODEL、AI_API_KEY、AI_BASE_URL、2 项超时、REDIS_URL否
求职与网络访问CRON_SECRET、WEB_ACCESS_PROVIDER、WEB_ACCESS_API_KEY、WEB_ACCESS_API_URL、WEB_SEARCH_SEARXNG_URL否
域名扩展APP_ALIAS_URL、CUSTOM_DOMAIN_TARGET、CUSTOM_DOMAIN_PROVIDER_SECRET、OLACV_API_KEY、WEB_FONT_BASE_URL否
特性开关8 项 FLAG_*否
仅开发工具链GOOGLE_CLOUD_API_KEY、CROWDIN_PROJECT_ID、CROWDIN_API_TOKEN、3 项 *_TEST_DATABASE_URL否(运行时不读取)

💡 技术拓展:Web 应用的「配置承载方式」常见三种——环境变量(12-Factor 风格)、配置文件(YAML/TOML)、数据库存储(管理后台可改)。Reactive Resume 选择环境变量单轨制:优点是配置即部署产物、可随编排文件版本化、没有「后台改了配置忘了同步到代码库」的漂移问题;代价是每次改动都要重启进程、没有运行时热更新。与之相对,数据库型配置(如 GitLab 的管理区)适合多租户频繁变更的场景,环境变量型更适合自托管实例的低频运维节奏。

五、核心参数分类详解

5.1 必填参数(缺一拒绝启动)

变量默认说明
APP_URL无(必填)对外访问地址,必须以 http:// 或 https:// 开头,且与浏览器地址栏完全一致。用于登录回跳、OAuth 回调、邮件链接、公开简历链接、社交预览与上传地址;为 https:// 时会话 Cookie 自动加 Secure 标记
DATABASE_URL无(必填)PostgreSQL 连接串 postgresql://USER:PASSWORD@HOST:5432/DATABASE,必须以 postgres:// 或 postgresql:// 开头;密码特殊字符需 URL 编码;可追加 ?sslmode=require 等供应商参数
AUTH_SECRET无(必填)会话签名与会话数据加密密钥,openssl rand -hex 32 生成;生产模式至少 32 字符,短值与 .env.example 示例值都会被启动校验拒绝(3.4 节实测)。生命周期内保持不变:变更 = 全员登出 + 两步验证密钥不可读 + API/MCP 令牌失效

三者是整个配置面的地基。APP_URL 与实际访问地址不符是最常见的自托管故障(登录回跳错位、Cookie 不生效、公开页链接错误都源于此)。

5.2 服务与监听

变量默认说明
PORT3000生产模式监听端口;官方发行版固定为 3000,改动需同步调整对外端口与健康检查
NODE_ENV默认 productionproduction 时监听 PORT 并开启限流;保持默认值即可
SERVER_PORT3001仅非生产(本地开发)模式使用,生产形态忽略
ROOT_RESUME_ID未设置设置后整站根路径 / 直接展示一份指定简历,替代营销首页

5.3 数据库

变量默认说明
DATABASE_MIGRATION_URL取 DATABASE_URL迁移专用连接串。仅当 DATABASE_URL 经过无法执行迁移的连接池(PgBouncer/云供应商池化端点)时需要单独设置
DATABASE_POOL_MAX10每个服务进程的最大数据库连接数,允许 1–100
STRICT_SCHEMA_CHECKfalse启动时把线上 schema 与迁移预期比对,默认不匹配只记日志继续启动;设 true 则拒绝启动。升级版本后想第一时间发现 schema 漂移时打开

5.4 登录认证

邮箱密码注册默认开启。以下均为可选增强:

变量组生效条件说明
GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET两项同时设置Google 登录;回调地址 APP_URL/api/auth/callback/google
GITHUB_CLIENT_ID + GITHUB_CLIENT_SECRET两项同时设置GitHub 登录,回调 .../callback/github
LINKEDIN_CLIENT_ID + LINKEDIN_CLIENT_SECRET两项同时设置LinkedIn 登录,回调 .../callback/linkedin
APPLE_CLIENT_ID + APPLE_CLIENT_SECRET两项同时设置Apple 登录:CLIENT_ID 用 Services ID,CLIENT_SECRET 是签名 JWT(不是 .p8 私钥),有效期最长 6 个月需轮换;回调 .../callback/apple
OAUTH_CLIENT_ID + OAUTH_CLIENT_SECRET + 发现 URL 或三端点组合设置自定义 OIDC/OAuth(Authentik/Keycloak/Authelia 等):OAUTH_DISCOVERY_URL 优先;手填则给 OAUTH_AUTHORIZATION_URL、OAUTH_TOKEN_URL、OAUTH_USER_INFO_URL;OAUTH_PROVIDER_NAME 定制按钮文案(默认 Custom OAuth);OAUTH_SCOPES 默认 openid profile email;回调 .../callback/custom
BETTER_AUTH_API_KEY未设置即不用连接 Better Auth 控制台服务,多数实例留空
BETTER_AUTH_INTERNAL_URLhttp://127.0.0.1:$PORT服务端自访地址,用于校验 API/MCP 的 OAuth 令牌;仅当 127.0.0.1 自访不通时才需设置
MOBILE_IOS_APP_IDS / MOBILE_ANDROID_PACKAGES / MOBILE_ANDROID_CERT_SHA256未设置时对应端点返回 404供 iOS/Android 原生应用的 App Links 关联文件使用

5.5 邮件

变量默认说明
SMTP_HOST未设置SMTP 主机名
SMTP_PORT587SMTP 端口
SMTP_USER / SMTP_PASS未设置认证凭据
SMTP_FROM未设置发件地址,如 Reactive Resume <noreply@example.com>
SMTP_SECUREfalsetrue = 全程 TLS(通常 465 端口);false = 要求 STARTTLS 升级成功,失败则报错(通常 587 端口)

发送开关是四项同时配齐(SMTP_HOST、SMTP_USER、SMTP_PASS、SMTP_FROM)才触发;未配齐时验证/重置邮件不发送、内容写入应用日志。实测未配置 SMTP 的实例在 /api/openapi/flags 中回显 "smtpEnabled":false,注册后日志出现 SMTP not configured; skipping email send. { to: 'admin@example.com', subject: 'Verify your email' }。

5.6 存储后端

变量默认说明
STORAGE_BACKEND自动推断显式可选 local/s3/blob/r2。不设置时按环境推断:Cloudflare Workers 上 r2;三项 S3_* 凭据配齐则 s3;Vercel 上 blob;其余(含官方发行版)local
LOCAL_STORAGE_PATH默认 /app/data本地存储目录,必须绝对路径;启动时检查可写,不可写拒绝启动
S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY / S3_BUCKET未设置S3 凭据与桶名;桶可保持私有,应用用自己的凭据读写并代理下载
S3_REGIONus-east-1桶区域
S3_ENDPOINTAWS 官方非 AWS 服务端点,如 MinIO/SeaweedFS 的 http://<host>:8333 或 R2 的账户端点
S3_FORCE_PATH_STYLEfalseMinIO、SeaweedFS 等自托管 S3 必须设 true(路径风格寻址),否则应用用虚拟主机风格寻址报 getaddrinfo ENOTFOUND bucket.endpoint
BLOB_READ_WRITE_TOKEN / BLOB_STORE_ID未设置Vercel Blob 专用
STORAGE_HEALTHCHECK_TIMEOUT_MS5000/api/health 存储检查总时限(含 S3 的 PUT+DELETE 探测);外置探活超时要大于此值
DEPLOYMENT_NAMESPACEdefaultRedis 键与 Blob 路径前缀,多实例共享存储时隔离数据;仅允许字母数字与 .、_、-

两个实测相关事实:本地存储形态下健康检查回显 "storage":{"type":"local","status":"healthy",...};上传限制为普通文件 10 MB、助手附件 25 MB。切换存储后端不会自动迁移已有文件,需自行拷贝并保持对象键一致。

5.7 AI 与 Redis

变量默认说明
ENCRYPTION_SECRET未设置个人 AI 与网络访问密钥的加密盐,≥32 字符、与 AUTH_SECRET 不同,短值拒绝启动。用户在「设置 → AI & developer」保存个人密钥的前提。变更后所有已存密钥不可读
AI_PROVIDER未设置服务端共享 AI 供应商:openai/anthropic/gemini/ollama/openai-compatible
AI_MODEL未设置共享模型名(如 gpt-5-mini),与 AI_PROVIDER 成对必填
AI_API_KEY未设置共享密钥(Ollama 可省略);不下发浏览器
AI_BASE_URL供应商默认自定义端点;openai-compatible 必填;本地/内网地址需同时开 FLAG_ALLOW_UNSAFE_AI_BASE_URL
AI_TEST_TIMEOUT_MS / AI_REQUEST_TIMEOUT_MS30000 / 300000连接测试 / 单次 AI 动作的超时毫秒数,本地慢模型可调大
REDIS_URL未设置redis:// 或 rediss:// 连接串。可选组件:密码认证写 redis://:<密码>@<host> 或 redis://default:<密码>@<host>

服务端配置了共享 AI 供应商时优先于个人配置(设置页显示「由服务器提供」并拒绝个人改动)。Redis 未配置时单实例功能完整,仅三处降级:助手被刷新打断的回复不可恢复、限流/停止按钮/每小时公开访问去重落在单进程内存、实时更新回退 PostgreSQL LISTEN/NOTIFY。多实例部署必须配置 Redis。AI 供应商与助手会话存于 PostgreSQL,不依赖 Redis。

5.8 求职调度与网络访问

变量默认说明
CRON_SECRET未设置保护 GET/POST /api/career/run 的 Bearer 令牌,≥16 字符;未设置该端点返回 404,令牌错误返回 401。Node.js 进程内部调度,无需此变量;仅 Vercel Cron 或外置调度器需要
WEB_ACCESS_PROVIDER未设置共享网络读取供应商:firecrawl/tavily/exa
WEB_ACCESS_API_KEY未设置共享密钥;Firecrawl 配自建 WEB_ACCESS_API_URL 时可免
WEB_ACCESS_API_URLFirecrawl 云端仅 Firecrawl 可自定义(可指向无密钥的自建实例);Tavily/Exa 固定官方端点
WEB_SEARCH_SEARXNG_URL未设置把求职搜索分流到自建 SearXNG(base URL 不含 /search),要求实例 search.formats 含 json;与 WEB_ACCESS_* 相互独立

5.9 域名扩展

变量默认说明
APP_ALIAS_URL未设置第二域名(如 https://rx.cv),承载简历公开页/短链/首页;登录与编辑器仍回 APP_URL
CUSTOM_DOMAIN_TARGET未设置用户自定义域名 CNAME 指向的主机名
CUSTOM_DOMAIN_PROVIDER_SECRET未设置≥32 字符;Traefik HTTP provider 经 X-Provider-Secret 头调 /api/internal/traefik 为每个已验证域名取路由与证书。与 CUSTOM_DOMAIN_TARGET 同时设置才启用自定义域名
OLACV_API_KEY未设置OlaCV 令牌;配合 FLAG_OLACV_SUGGESTION 检查 .cv 域名可注册性
WEB_FONT_BASE_URL未设置服务端 PDF 渲染时内置五款 Computer Modern 字体的 base URL;仅影响服务端渲染,浏览器端预览不受影响

5.10 特性开关(8 项,默认全部 false)

变量设为 true 的效果
FLAG_DISABLE_SIGNUPS关闭全部注册入口(邮箱/社交/来宾),已有账号不受影响。实测经 /api/openapi/flags 回显 disableSignups 观测
FLAG_DISABLE_EMAIL_AUTH关闭邮箱密码注册与登录(含忘记/重置密码),仅社交或自定义 OAuth 登录,需先配好至少一个
FLAG_ENABLE_GUEST_LOGIN登录页显示「以来宾身份继续」,来宾可建简历导出后即走;后续注册/登录可继承来宾数据,但先登出来宾则丢失。实测回显 allowGuestLogin
FLAG_DISABLE_IMAGE_PROCESSING上传图片不再压缩到 800×800 JPEG,按原样存储;低功耗设备(树莓派)建议开启
FLAG_DISABLE_API_RATE_LIMIT关闭 API 与认证限流(登录/注册/OAuth/API Key/PDF 导出/AI)。仅测试环境使用
FLAG_ALLOW_UNSAFE_AI_BASE_URL允许 AI 供应商用 http:// 或内网地址(如内网 Ollama)
FLAG_ALLOW_UNSAFE_OAUTH_REDIRECT_URI允许 MCP/OAuth 自注册客户端用任意回调地址。共享实例禁用(钓鱼/令牌窃取风险)
FLAG_OLACV_SUGGESTION在分享页向未绑定自定义域名的用户建议注册 .cv 域名,需自定义域名功能开启

⚠️ 两个 FLAG_ALLOW_UNSAFE_* 只应在全员可信的实例上开启:不安全的 AI base URL 会让用户诱导服务器访问内网地址,不安全的回调地址可用于钓鱼或窃取令牌。

六、生产配置模板

两档按规模划分的 .env 模板(变量值替换为自己的密钥与地址):

单人/家庭实例(1 vCPU / 2 GB 内存 / 10 GB 磁盘,本栏为本文实测形态):

APP_URL=https://resume.example.com
POSTGRES_PASSWORD=q1w2e3r4
DATABASE_URL=postgresql://postgres:q1w2e3r4@postgres:5432/postgres
AUTH_SECRET=<openssl rand -hex 32 生成>
ENCRYPTION_SECRET=<openssl rand -hex 32 生成>
FLAG_DISABLE_SIGNUPS=true

要点:单人自用建完自己的账号后关闭注册;存储用默认 local(数据卷),不配 Redis、SMTP 可后补。

小团队实例(2 vCPU / 4 GB 内存 / 40 GB 磁盘,启用邮件 + 共享存储 + 来宾模式):

APP_URL=https://resume.example.com
POSTGRES_PASSWORD=q1w2e3r4
DATABASE_URL=postgresql://postgres:q1w2e3r4@postgres:5432/postgres
AUTH_SECRET=<openssl rand -hex 32 生成>
ENCRYPTION_SECRET=<openssl rand -hex 32 生成>
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=noreply@example.com
SMTP_PASS=<SMTP 密码>
SMTP_FROM=Reactive Resume <noreply@example.com>
SMTP_SECURE=false
STORAGE_BACKEND=s3
S3_ACCESS_KEY_ID=<访问键>
S3_SECRET_ACCESS_KEY=<秘密键>
S3_BUCKET=reactive-resume
S3_ENDPOINT=http://<内网S3主机>:8333
S3_FORCE_PATH_STYLE=true
REDIS_URL=redis://<内网Redis主机>:6379
STRICT_SCHEMA_CHECK=true
DATABASE_POOL_MAX=20

要点:S3 自托管网关必须 S3_FORCE_PATH_STYLE=true;配了 Redis 才支持多实例与限流跨进程共享;STRICT_SCHEMA_CHECK=true 让版本升级后的 schema 漂移直接拦在启动阶段;团队实例保留注册开放,靠邮箱验证 + 限流管理。

七、常见问题(FAQ)

Q1:改了 .env 但行为没变化? 按顺序核对:环境变量是否被进程环境中的同名变量覆盖(环境优先于文件);布尔值是否用了非法写法(只认 true/false/1/0/yes/no/on/off);是否漏了重建应用服务(改文件不重启不生效)。最后用 GET /api/openapi/flags 观测——实测 FLAG_ENABLE_GUEST_LOGIN 开与关两轮,allowGuestLogin 精确跟随(见 3.2 节)。

Q2:服务起不来,日志报 Invalid environment variables? 启动校验拦截,报错会点名变量与原因。实测将 AUTH_SECRET 改为 8 字符即触发 AUTH_SECRET must be at least 32 characters in production. Generate one with openssl rand -hex 32.(3.4 节回显)。按报错修改变量后重建即可。

Q3:注册/重置密码的邮件收不到? 四项 SMTP_HOST/SMTP_USER/SMTP_PASS/SMTP_FROM 必须全部设置才会真正发信。未配齐时邮件写日志(实测回显见 5.5 节),日志里 SMTP not configured; skipping email send 即此因。配齐后仍发不出,核对 SMTP_PORT/SMTP_SECURE 与供应商设置是否匹配(465 用 SMTP_SECURE=true,587 用 false)。

Q4:接自建 MinIO/SeaweedFS 后上传报 getaddrinfo ENOTFOUND bucket.endpoint? 应用按虚拟主机风格寻址把桶名拼进了主机名。设置 S3_FORCE_PATH_STYLE=true(官方排障节同款结论),自托管 S3 网关一律需要。

Q5:/api/health 的 storage 显示 unhealthy? 本地存储形态检查挂载目录是否可被 UID 1000 写入;S3 形态检查凭据、桶名与端点。检查超时可调 STORAGE_HEALTHCHECK_TIMEOUT_MS(默认 5000 毫秒)。实测正常实例回显 "storage":{"type":"local","status":"healthy"}。

Q6:想临时限制只允许已有人使用,但又想用来宾模式做演示? 两者冲突:FLAG_DISABLE_SIGNUPS=true 会同时关闭来宾入口(官方明确「Has no effect while FLAG_DISABLE_SIGNUPS is true」指向来宾)。演示期先只开 FLAG_ENABLE_GUEST_LOGIN=true,演示结束再改关注册。

八、参考链接