Jotty 1.29.2 配置参数详解

基于 1.29.2 实测:全部环境变量九组详解(基础运行、反代、附件公开、SSO/OIDC、多实例 HA、API 开关)、组合示例与五则排障实录。

Jotty笔记任务管理自托管2026/10/30

Jotty 1.29.2 配置参数详解

目标:梳理 Jotty 1.29.2 的配置体系与全部环境变量,给出推荐取值与组合示例。参数语义依据仓库 howto/ENV-VARIABLES.md、howto/DOCKER.md 与 docker-compose.yml(查询日期 2026-10-30),开关行为与排障均在 1.29.2 实测环境验证。部署步骤见《Jotty 1.29.2 Docker Compose 部署指南》。

一、配置体系总览

Jotty 无独立配置文件,配置分两轨:

  1. 环境变量(部署层):随服务注入,覆盖运行模式、身份、反代、SSO、安全、多实例等,本文全部收录;
  2. 数据目录内 JSON 文件(业务层):data/users/users.json(账户与 API 密钥)、data/users/sessions.json(会话)、data/sharing/shared-items.json(分享)等由系统自动维护,不建议手工编辑(结构依据 README"Data Storage"章节)。

环境变量分九组逐一说明。以下未标注"可选"者均为官方标注的必填或强推荐项。

二、基础运行参数

参数默认值说明
NODE_ENV无生产实例必填,固定 production,使 Node.js 进入生产模式
PUID1000运行身份的用户 ID。NAS(Unraid 等)需与挂载目录属主一致;compose 中显式 user: 指令优先级更高
PGID1000同上,组 ID
UMASK002新建文件/目录权限掩码,常用 002(组可写)或 022(仅属主可写)
JOTTY_BODY_SIZE_LIMIT100mb请求体上限(上传、drawio 附件、头像等),单位支持 b/kb/mb/gb;由运行时补丁器在启动时应用
STOP_CHECK_UPDATES未设即开启检查设为 yes 后不再调用 GitHub API 检查新版本,去掉"新版本可用"提示;离线/内网环境推荐
DEFAULT_LOCALEen未登录界面(如登录页)及未自选语言用户的界面语言
JOTTY_FREEBSD未设仅 FreeBSD 生效的兼容补丁开关(stub @swc/core、改用 webpack),Linux 上设不设置都无效

实测记录:以 NODE_ENV=production 启动后日志出现 Ready on http://0.0.0.0:3000;启动时运行时补丁器输出 [patch:patches] freebsd_20260427: skipped (JOTTY_FREEBSD not set),与上表语义一致。

三、反向代理与 HTTPS 参数

参数默认值说明
HTTPS未设设 true 后会话 Cookie 标记 Secure;TLS 通常由反代终结,此开关只影响 Cookie 安全位
APP_URL未设强制实例基址。SSO 必填;反代后登录异常时优先设置——登录流程将以此 URL 为准
INTERNAL_API_URLhttp://localhost:3000服务进程对自身 API 的调用地址;仅在反代后会话校验失败时需要调整
DEBUGGER未设诊断日志开关,两个标志:proxy(OIDC/登录/路由)、crud(增删改查计时),* 全开

排障经验(官方 howto/ENV-VARIABLES.md 明示的典型场景):反代后登录失败,第一步设 APP_URL,仍失败再设 DEBUGGER=proxy 观察日志;多实例集群还需代理正确转发 WebSocket 升级头并保持 Host 不变(howto/DOCKER.md"Running more than one instance")。

四、附件公开访问参数

参数默认值说明
SERVE_PUBLIC_IMAGES未设(不公开)设 yes 后上传图片可凭直链免登录访问
SERVE_PUBLIC_FILES未设同上,适用于普通文件附件
SERVE_PUBLIC_VIDEOS未设同上,适用于视频

安全提示:三者一旦开启即等于"知道链接的任何人可读"。1.29.0 的附件重构已将附件可见性收敛到笔记权限(release notes:附件仅对拥有/可访问该笔记的用户可见),这三个开关属于面向外链嵌入场景的显式放行,公开实例建议保持默认关闭。官方发布说明同时表示这三个变量将随附件权限重构逐步退役。

五、安全与账号保护参数

参数默认值说明
DISABLE_BRUTEFORCE_PROTECTION未设(保护开启)默认连续 3 次本地登录失败即锁定,退避延迟 10s→30s→60s…;设 yes 完全关闭,不建议
ENABLE_PWA_ZOOM未设(禁用缩放)设 yes 允许 PWA 内缩放,无障碍场景使用

六、SSO / OIDC 参数(可选组)

启用 SSO 的最小集:APP_URL + AUTH_MODE=oidc + OIDC_ISSUER + OIDC_CLIENT_ID。

参数必填说明
AUTH_MODE是(启用 SSO 时)设 oidc;旧名 SSO_MODE 仍兼容
OIDC_ISSUER是OIDC 提供方地址(Authentik/Auth0/Keycloak 等)
OIDC_CLIENT_ID是提供方签发的客户端 ID
OIDC_CLIENT_SECRET可选机密客户端的 secret
OIDC_CLIENT_ID_FILE可选以文件形式提供 client ID(Docker Secrets),设置后覆盖同名环境变量
OIDC_CLIENT_SECRET_FILE可选同上,secret 版
SSO_FALLBACK_LOCAL可选设 yes 保留本地账密登录作为旁路,推荐设置,避免 IdP 故障时锁死
OIDC_ADMIN_GROUPS可选组映射:成员自动成为管理员,逗号分隔
OIDC_ADMIN_ROLES可选角色映射:管理员,逗号分隔
OIDC_USER_GROUPS可选登录白名单组;设置后仅这些组(及管理员)可登录
OIDC_USER_ROLES可选登录白名单角色
OIDC_GROUPS_SCOPEgroups获取用户组的 scope;Entra ID 等不支持 groups scope 的提供方设为空串或 no
OIDC_LOGOUT_URL可选全局登出地址,登出时跳转 IdP

七、多实例(HA)参数

参数默认值说明
JOTTY_NODE未设(单实例)实例唯一名(字母/数字/-/_)。设置即开启集群:多实例共享同一 data/ 目录,实时协作跨实例生效,各自持有独立索引 data/.relations_<name>.db
JOTTY_RELATIONS_DBdata/.relations_<node>.db覆盖索引路径;多实例时每个实例必须指向不同路径(官方明示两实例共写一个索引会损坏)

集群工作原理(howto/DOCKER.md,查询日期 2026-10-30):实例间通过 data/.replica/ 下的一次性小文件交换打开中笔记的实时内容与持有者,全部关闭后该文件删除;持久副本始终只有笔记本身,不引入数据库或消息队列。故障表现:单实例宕机时编辑器显示 Offline 并继续接受输入,恢复后重新同步。

八、API 与 MCP 相关开关

参数默认值说明
ENABLE_API_DOCS未设(关闭)开启后 GET /api/docs 无需密钥即可读取 OpenAPI 文档(JSON;?format=yaml 输出 YAML)。注意 REST API 本身不受此开关影响,始终可用

开关行为实测(1.29.2):

# 默认(未设置 ENABLE_API_DOCS):
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8131/api/docs
# 实测回显:HTTP 404

# compose 追加 ENABLE_API_DOCS=true 并重建后:
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8131/api/docs
# 实测回显:HTTP 200
curl -s "http://127.0.0.1:8131/api/docs?format=yaml"
# 实测回显(节选):
# openapi: 3.1.0
# info:
#   title: Jotty API
#   version: 1.29.2

对比之下,需密钥的 GET /api/openapi.json 在未认证时实测返回 401。公开实例若不想暴露 API 全貌,保持 ENABLE_API_DOCS 关闭即可(上述端口为实测环境取值,按你的部署替换)。MCP 网关为独立伴生发布物(ghcr.io/fccview/jotty-mcp),通过 JOTTY_MCP_AUTH_TOKEN、JOTTY_MCP_TRANSPORT=http、JOTTY_MCP_PORT 三个自身环境变量接入主服务,见仓库 docker-compose.mcp.yml。

九、组合示例

个人实例(本机实测基线):

environment:
  - NODE_ENV=production
  - STOP_CHECK_UPDATES=yes
  - DEFAULT_LOCALE=en

反代 + SSO 实例(Authentik):

environment:
  - NODE_ENV=production
  - HTTPS=true
  - APP_URL=https://notes.example.com
  - AUTH_MODE=oidc
  - OIDC_ISSUER=https://auth.example.com/application/o/jotty
  - OIDC_CLIENT_ID_FILE=/run/secrets/oidc_client_id
  - OIDC_CLIENT_SECRET_FILE=/run/secrets/oidc_client_secret
  - SSO_FALLBACK_LOCAL=yes
  - OIDC_ADMIN_GROUPS=jotty-admins

双实例高可用(共享 data/ 目录 + 独立节点名):

# 实例 A
environment:
  - NODE_ENV=production
  - JOTTY_NODE=node1
# 实例 B(共享同一 data/ 挂载)
environment:
  - NODE_ENV=production
  - JOTTY_NODE=node2

十、排障实录(实测沉淀)

  1. /api/docs 返回 404:不是故障,ENABLE_API_DOCS 默认关闭(实测关态 404、开态 200,见第八节)。排查其他接口异常时勿将此 404 误判为服务未就绪——服务就绪以启动日志 Ready on http://0.0.0.0:3000 为准。
  2. 改环境变量不生效:docker compose up -d 只在检测到配置变化时重建服务;确认 compose 文件已保存后观察其输出是否出现 Recreated 行。实测追加 ENABLE_API_DOCS 后重建输出包含 Container jotty Starting / Started,新值随即生效。
  3. 登录页循环重定向:反代场景优先补 APP_URL;仍异常时临时开启 DEBUGGER=proxy 查看登录链路日志,定位后关闭。
  4. NAS 上权限报错:user: "1000:1000" 与目录属主不一致所致,将 PUID/PGID 与 chown 目标对齐(属主核对方法见部署指南 6.2 节)。
  5. 多实例实时协作无头像:代理未保留 Host 头或未转发 WebSocket 升级,页面仍可用(打字照常保存),按第七节要求修正代理。

十一、参数速查表(一页版)

参数一句话语义默认
NODE_ENV生产模式必填无
PUID / PGID / UMASK运行身份与文件掩码1000/1000/002
HTTPSCookie Secure 位关
APP_URL实例基址(SSO 必填)无
INTERNAL_API_URL自调用地址http://localhost:3000
SERVE_PUBLIC_IMAGES/FILES/VIDEOS附件直链公开关
STOP_CHECK_UPDATES关更新检查关(即默认检查)
DEFAULT_LOCALE未登录语言en
DISABLE_BRUTEFORCE_PROTECTION关爆破保护关(保护开)
ENABLE_PWA_ZOOMPWA 缩放关
JOTTY_BODY_SIZE_LIMIT请求体上限100mb
ENABLE_API_DOCS无密钥读 OpenAPI 文档关
JOTTY_NODE多实例节点名未设
JOTTY_RELATIONS_DB索引路径覆盖按节点名
AUTH_MODE + OIDC_*SSO 组(13 项,见第六节)未启用
DEBUGGERproxy/crud 诊断日志关

配置到位后,建议按《Jotty 1.29.2 REST API 实战指南》完成 API 链路的端到端验收;组件定位回看《Jotty 1.29.2 介绍与选型指南》。