HedgeDoc 1.12.0 配置参数详解
HedgeDoc 1.12.0 双轨配置体系(config.json 与 CMD_* 环境变量)逐项解析:官方默认值、实测行为与生产配置模板
HedgeDoc 1.12.0 配置参数详解
目标:系统梳理 HedgeDoc 1.12.0 的双轨配置体系(config.json 文件 / CMD_* 环境变量),逐项给出官方默认值与实测行为,并交付一份生产配置模板。本文默认值口径取自官方配置文档(docs.hedgedoc.org/configuration/,1.x,2026-10-22 查证),标注「实测」的行为均在 Ubuntu 22.04.4 LTS + HedgeDoc 1.12.0 实验实例上验证通过(部署过程见 《HedgeDoc 1.12.0 Docker Compose 部署指南》)。
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.4 LTS(x86_64,IP 192.168.146.128) |
| HedgeDoc 版本 | 1.12.0(官方最新稳定版,2026-08-21 发布) |
| 数据库 | PostgreSQL 16.15 |
| 应用内 Node.js | v24.22.1 |
| 配置文档口径 | 官方 configuration 文档(1.x/master 分支,2026-10-22 查证) |
| 实测方式 | 环境变量经 Docker Compose 注入;config.json 经文件挂载注入,观察启动日志与 HTTP 行为验证生效 |
二、前置条件
- 已按 《HedgeDoc 1.12.0 Docker Compose 部署指南》完成部署且
/_health返回{"ready":true}; - 知晓本文两条主线:环境变量(
CMD_*)与 config.json 文件,两者任选其一或混用; - 改动配置后需要重建应用服务才生效(环境变量是启动时读取的),验证手段统一为「启动日志 +
/_health+ 对应端点行为」。
三、参数查看与修改方式
3.1 双轨体系与优先级
官方配置文档的规则(原文口径):
- 环境变量优先于 config.json:"Environment variables take precedence over configurations from the config files";
- 环境变量以
CMD_前缀命名(历史上的HMD_前缀改名而来,旧前缀仍兼容); - config.json 的查找路径可用
CMD_CONFIG_FILE环境变量覆盖(默认无强制路径,官方建议从仓库config.json.example复制改造); - 参数解析代码在官方仓库
lib/config/environment.js(环境变量)与lib/config/index.js(config.json),默认值定义在lib/config/default.js。
3.2 修改方法(Compose 部署形态)
方式一:环境变量(推荐,改动即见,无需额外文件)——编辑 /opt/hedgedoc/docker-compose.yml 的 app.environment 段后重建:
cd /opt/hedgedoc
docker compose up -d # environment 变化时 compose 会自动重建应用服务
Container hedgedoc-1.12.0-app Recreate
Container hedgedoc-1.12.0-app Recreated
Container hedgedoc-1.12.0-app Starting
Container hedgedoc-1.12.0-app Started
方式二:config.json 文件——创建 /opt/hedgedoc/config.json,在 compose 的 app 服务加挂载:
volumes:
- /opt/hedgedoc/config.json:/hedgedoc/config.json:ro
environment:
- CMD_CONFIG_FILE=/hedgedoc/config.json
config.json 是否被正确读取,可用「缺关键项」的方法实测确认:本文实验中曾挂载一份未含 sessionSecret 的最小 config.json({"domain":"192.168.146.128","loglevel":"info"}),启动日志立即出现对应告警,证明文件被解析(实测回显):
2026-10-21T16:29:42.034Z warn: Session secret not set. Using random generated one. Please set `sessionSecret` in your config.json file. All users will be logged out.
2026-10-21T16:29:42.506Z info: All migrations performed successfully
2026-10-21T16:29:42.511Z info: HTTP Server listening at 0.0.0.0:3000
3.3 生效验证三板斧(每改必验)
- 启动日志:
docker compose logs --since 1m app,确认无Session secret not set类告警、无 config 解析报错; - 健康端点:
curl -s http://192.168.146.128:8132/_health→{"ready":true}; - 行为端点:改了什么就验什么(如改
CMD_ENABLE_STATS_API验/status,改CMD_ALLOW_EMAIL_REGISTER验/register),本文第五章各参数均附实测或官方口径的行为。
四、参数总览
HedgeDoc 1.x 的参数按域分为 8 组。下表为全景索引(★=本文有实测行为佐证):
| 参数域 | 代表参数(环境变量) | 关键默认值 |
|---|---|---|
| 运行时与数据库 | CMD_DB_URL、CMD_LOGLEVEL、DEBUG | 无默认库配置;日志级别 info |
| 网络与位置 | CMD_DOMAIN、CMD_PORT、CMD_URL_ADDPORT、CMD_PROTOCOL_USESSL | domain null;端口 3000;urlAddPort false |
| 用户与权限 | CMD_ALLOW_ANONYMOUS ★、CMD_ALLOW_EMAIL_REGISTER ★、CMD_DEFAULT_PERMISSION、CMD_SESSION_SECRET ★ | 匿名 true;邮箱注册 true;默认权限 editable |
| 笔记与内容 | CMD_ALLOW_FREEURL、CMD_DOCUMENT_MAX_LENGTH、CMD_FORBIDDEN_NOTE_IDS | freeURL false;最大长度 100000 |
| 安全(CSP/HSTS/限流) | CMD_CSP_ENABLE、CMD_HSTS_ENABLE、CMD_RATE_LIMIT_USER | csp true;hsts true;限流 10 次/5 分钟 |
| 邮箱与第三方登录 | CMD_EMAIL、CMD_LDAP_*、CMD_OAUTH2_*、CMD_SAML_* 等 | 邮箱登录 true;三方均无默认值 |
| 图片与上传存储 | CMD_IMAGE_UPLOAD_TYPE、CMD_S3_*、CMD_MINIO_* | 存储 filesystem |
| 运维可观测 | CMD_ENABLE_STATS_API ★、CMD_SOURCE_URL、CMD_TOOBUSY_LAG | stats true;lag 70ms |
如何选:先用最小集(域名 + 数据库 + 会话密钥)跑通(见第六章模板),再按需逐域加参数——每加一个都用 3.3 节的三板斧验证,避免一次性堆参数排障困难。
五、核心参数分类详解
5.1 运行时与数据库
| 参数(环境变量) | 官方默认值 | 说明与实测 |
|---|---|---|
CMD_DB_URL | 无 | 数据库连接串(URL 式)。实测:postgres://hedgedoc:…@database:5432/hedgedoc 一次连通;官方文档注明设置后覆盖拆分式 db.* 项 |
CMD_DB_USERNAME/CMD_DB_PASSWORD/CMD_DB_DATABASE/CMD_DB_HOST/CMD_DB_PORT/CMD_DB_DIALECT | 均无 | 拆分式数据库连接(与 URL 二选一,混用以 URL 为准)。dialect 取值如 postgres、mariadb(1.x 实际仅 PostgreSQL 可作主库) |
CMD_LOGLEVEL | info | 日志级别:debug/verbose/info/warn/error。排障时临时调 debug |
DEBUG | false | 调试模式开关(config.json 键为 debug),输出更细日志 |
NODE_ENV | production 或 development | 运行环境;官方镜像默认按 production 运行 |
CMD_TOOBUSY_LAG | 70 | 事件循环滞后阈值(毫秒),超过则对连接限流(过载保护) |
CMD_DOCUMENT_MAX_LENGTH | 100000 | 单篇笔记最大字符数。超长内容会被拒绝保存 |
⚠️ 注意:官方镜像内置数据库驱动仅含 PostgreSQL;不要尝试把
CMD_DB_DIALECT指向 sqlite/mysql——1.12.0 官方文档的安装矩阵只有 PostgreSQL。
5.2 网络与位置
| 参数(环境变量) | 官方默认值 | 说明与实测 |
|---|---|---|
CMD_DOMAIN | null | 对外主机名/IP,分享链接与回调基准。实测:设为 192.168.146.128 后注册/登录重定向均为 http://192.168.146.128/ |
CMD_PORT | 3000 | 应用监听端口。官方文档特别注明:开启 urlAddPort 时 URL 生成也使用该值——实测证实(见本表 CMD_URL_ADDPORT 行) |
CMD_HOST | 0.0.0.0 | 监听网卡地址 |
CMD_URL_PATH | null | 子路径部署(如 www.example.com/hedgedoc)时填写 |
CMD_URL_ADDPORT | false | 生成的链接是否拼接端口(80/443 不会拼)。实测:设 true 后登录重定向变为 http://192.168.146.128:3000/——拼的是 CMD_PORT(容器内 3000),不是宿主机映射端口 8132;即「非标准端口映射」场景下不能只靠它修链接(正确做法见本表 CMD_PORT 行与第七章 Q3) |
CMD_PROTOCOL_USESSL | false | 资源路径按 https 生成(反代 TLS 场景开启) |
CMD_PATH | 无 | UNIX socket 监听路径(设置后忽略 host/port 监听) |
CMD_ALLOW_ORIGIN | 无 | 允许的跨域来源列表,需覆盖实际访问主机名 |
5.3 用户与权限
| 参数(环境变量) | 官方默认值 | 说明与实测 |
|---|---|---|
CMD_ALLOW_ANONYMOUS | true | 允许匿名访问与匿名建笔记。实测:改 false 并重建后,未登录访问 /new 被重定向回首页(GET /new -> 302 redirect=http://192.168.146.128/),无法匿名新建 |
CMD_ALLOW_ANONYMOUS_EDITS | false | 仅在匿名访问关闭时生效:允许「freely」权限笔记被访客编辑 |
CMD_ALLOW_EMAIL_REGISTER | true | 邮箱自助注册开关。实测:改 false 后 POST /register 返回 404(注册端点关闭),用户表计数保持不变;已注册用户登录不受影响 |
CMD_EMAIL | true | 邮箱登录总开关(关掉后 allowEmailRegister 无效) |
CMD_DISABLE_NOTE_CREATION | false | 设 true 禁止任何人新建笔记(只读站场景) |
CMD_DEFAULT_PERMISSION | editable | 新建笔记默认权限:freely/editable/limited/locked/protected/private |
CMD_REQUIRE_FREEURL_AUTHENTICATION | false | freeURL 模式建笔记是否要求登录 |
CMD_SESSION_SECRET | 无(每次启动随机生成) | 会话 Cookie 签名密钥。实测:未设置时启动日志必现告警 Session secret not set. Using random generated one. … All users will be logged out.——必须设置固定值 |
CMD_SESSION_LIFE | 1209600000(14 天) | 会话有效期(毫秒) |
5.4 笔记与内容
| 参数(环境变量) | 官方默认值 | 说明 |
|---|---|---|
CMD_ALLOW_FREEURL | false | 允许「访问不存在的笔记 URL 即创建」,Etherpad 式用法;团队习惯固定知识库名称时可开启 |
CMD_FORBIDDEN_NOTE_IDS | ['robots.txt','favicon.ico','api','build','css','docs','fonts','js','uploads','vendor','views'] | 保留路径,禁止被 freeURL 抢注为笔记名 |
CMD_EXTERNAL_LINK_WARNING | true | 外链跳转警告页(经 /_link 中转)。实测:1.12.0 发布说明明确本版起笔记内链接一律新标签页打开 |
CMD_EXTERNAL_LINK_WHITELIST | [] | 免警告白名单主机,如 example.com,trusted.org,*.example.org |
CMD_ALLOW_GRAVATAR | true | 头像源(Libravatar)。内网/隐私场景设 false |
CMD_IMAGE_UPLOAD_TYPE | filesystem | 图片存储:filesystem/imgur/s3/minio/azure/lutim |
CMD_ENABLE_UPLOADS | all | 上传权限:all(含访客)/registered/none;未设置且匿名全关时自动取 registered |
5.5 安全(CSP / HSTS / 限流 / Cookie)
| 参数(环境变量) | 官方默认值 | 说明 |
|---|---|---|
CMD_CSP_ENABLE | true | Content-Security-Policy 头开关(官方不建议关闭) |
CMD_CSP_ADD_DISQUS / CMD_CSP_ADD_GOOGLE_ANALYTICS | false | 放行 Disqus/Google Analytics(官方不建议,扩大 XSS 面) |
CMD_CSP_ALLOW_FRAMING | true | 是否允许 iframe 嵌入本站(官方强烈建议关闭) |
CMD_CSP_ALLOW_PDF_EMBED | true | 是否允许 PDF 内嵌(官方建议关闭) |
CMD_CSP_REPORTURI | 无 | CSP 违规上报地址 |
CMD_HSTS_ENABLE | true | HSTS(需 HTTPS 生效才起作用) |
CMD_HSTS_INCLUDE_SUBDOMAINS | false | HSTS 覆盖子域 |
CMD_HSTS_MAX_AGE | 31536000 | HSTS 有效期(一年,秒) |
CMD_HSTS_PRELOAD | false | 允许 HSTS 预加载列表 |
CMD_COOKIE_POLICY | lax | SameSite 策略:lax/strict/none(none 且无 https 会直接破坏编辑器) |
CMD_RATE_LIMIT_USER | 10 | 每用户每 5 分钟登录/注册类操作上限(0 关闭) |
CMD_RATE_LIMIT_NEW_NOTES | 20 | 每用户每 5 分钟新建笔记上限(0 关闭) |
CMD_RATE_LIMIT_USING_CLOUDFLARE | false | 经 Cloudflare 代理时按 CF 的 IP 头限流 |
💡 技术拓展:「登录限流」的常见实现路线对比——
路线 原理 适用场景 应用内窗口限流(HedgeDoc 内置) 按用户+5 分钟窗口计数 单实例,开箱即用(本文实测对象) 反向代理层限流(nginx limit_req 等) 在 HTTP 入口按 IP/键限流 多实例统一入口管控 专业网关/WAF 规则引擎 + 风险评分 高暴露面公网服务 HedgeDoc 单实例部署用内置
CMD_RATE_LIMIT_USER/CMD_RATE_LIMIT_NEW_NOTES即可覆盖注册撞库与灌水场景。
5.6 登录方式集成(本地邮箱之外的 IdP)
以下均为「配了才启用」的集成项,默认全部关闭(无默认值)。完整字段见官方配置文档对应小节,此处列参数骨架与关键取值:
| 集成 | 关键环境变量 | 要点 |
|---|---|---|
| LDAP/AD | CMD_LDAP_URL、CMD_LDAP_BINDDN、CMD_LDAP_BINDCREDENTIALS、CMD_LDAP_SEARCHBASE、CMD_LDAP_SEARCHFILTER、CMD_LDAP_USERIDFIELD、CMD_LDAP_TLS_CA 等 | 企业域账号接入;filter 形如 (uid={{username}}) |
| OAuth2/OIDC | CMD_OAUTH2_CLIENT_ID/CLIENT_SECRET/AUTHORIZATION_URL/TOKEN_URL/USER_PROFILE_URL/SCOPE/PKCE 等 | 通用 OAuth2;CMD_OAUTH2_SCOPE 默认 openid email profile |
| SAML | CMD_SAML_IDPSSOURL、CMD_SAML_IDPCERT、CMD_SAML_IDENTIFIERFORMAT 等 | 名称格式默认 urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress |
| GitHub | CMD_GITHUB_CLIENTID/CMD_GITHUB_CLIENTSECRET | OAuth App 注册后填入 |
| GitLab | CMD_GITLAB_BASEURL、CMD_GITLAB_CLIENTID、CMD_GITLAB_CLIENTSECRET、CMD_GITLAB_VERSION(默认 v4) | 自建 GitLab 填 BASEURL |
CMD_GOOGLE_CLIENTID/CMD_GOOGLE_CLIENTSECRET/CMD_GOOGLE_HOSTEDDOMAIN | 限制组织域时填 hostedDomain | |
| Mattermost/Dropbox/Facebook/Twitter | CMD_MATTERMOST_*、CMD_DROPBOX_*、CMD_FACEBOOK_*、CMD_TWITTER_* | 对应开发者平台申请 |
⚠️ 注意:1.12.0 发布说明的行为变更——「若未启用表单登录且恰好只配置了一个外部登录方式,登录弹窗会自动跳过」,即配置单一 IdP 后用户进入即是 IdP 认证页。自建企业站建议只保留一种 IdP +
CMD_ALLOW_EMAIL_REGISTER=false,收敛入口。
5.7 图片与上传存储(filesystem 之外)
CMD_IMAGE_UPLOAD_TYPE 决定图片去向。选 s3/minio/azure 时需同步配置对应密钥组:
| 存储 | 关键环境变量 | 默认值 |
|---|---|---|
| S3 | CMD_S3_ACCESS_KEY_ID、CMD_S3_SECRET_ACCESS_KEY、CMD_S3_REGION、CMD_S3_BUCKET、CMD_S3_ENDPOINT、CMD_S3_FOLDER(默认 uploads)、CMD_S3_PUBLIC_FILES(默认 false) | 均无 |
| MinIO | CMD_MINIO_ACCESS_KEY、CMD_MINIO_SECRET_KEY、CMD_MINIO_ENDPOINT、CMD_MINIO_PORT(9000)、CMD_MINIO_SECURE(true) | 均无 |
| Azure Blob | CMD_AZURE_CONNECTION_STRING、CMD_AZURE_CONTAINER | 均无 |
| imgur | CMD_IMGUR_CLIENTID | 无 |
| lutim | CMD_LUTIM_URL | https://framapic.org/ |
如何选:单机小团队用默认 filesystem(配合 uploads 目录持久化,见部署篇)即可;图片量大或多实例共享存储时选 MinIO/S3。CMD_MINIO_SECURE 默认 true,对接内网自建 MinIO(无 TLS)必须显式设 false,这是最常见踩坑点。
5.8 运维可观测
| 参数(环境变量) | 官方默认值 | 说明与实测 |
|---|---|---|
CMD_ENABLE_STATS_API | true | /status 与 /metrics 端点开关。实测:设 false 后 GET /status 返回 302 重定向回首页(端点关闭),恢复 true 后重新返回 JSON 状态 |
CMD_SOURCE_URL | 无 | 入口页展示的源码链接(魔改版必须填写,AGPL 合规要求) |
CMD_LOGLEVEL | info | 见 5.1,排障期临时 debug |
六、生产配置模板
适用场景:8–32 人团队、单服务器(4 核 8GB、NVMe SSD)、直接 http://IP:8132 访问、本地邮箱认证、filesystem 图片存储。文件:/opt/hedgedoc/docker-compose.yml 的 app 服务环境变量段(数据库段见部署篇):
environment:
# —— 位置与访问 ——
- CMD_DOMAIN=192.168.146.128 # 对外 IP 或域名
- CMD_ALLOW_ORIGIN=['192.168.146.128']
- CMD_URL_ADDPORT=true # 分享链接拼接端口
# —— 数据库 ——
- CMD_DB_URL=postgres://hedgedoc:hedgedoc-db-2026@database:5432/hedgedoc
# —— 会话 ——
- CMD_SESSION_SECRET=hd-session-secret-2026-quzuo # 用 pwgen -s 64 1 生成自己的
- CMD_SESSION_LIFE=604800000 # 会话 7 天(毫秒)
# —— 注册与权限收敛 ——
- CMD_ALLOW_EMAIL_REGISTER=false # 关自助注册,账号走 CLI 创建
- CMD_ALLOW_ANONYMOUS=false # 关匿名,全员实名
- CMD_DEFAULT_PERMISSION=private # 新笔记默认私有
- CMD_ENABLE_UPLOADS=registered # 仅注册用户可传图
# —— 安全加固 ——
- CMD_CSP_ALLOW_FRAMING=false # 禁 iframe 嵌入
- CMD_CSP_ALLOW_PDF_EMBED=false # 禁 PDF 内嵌
- CMD_ALLOW_GRAVATAR=false # 内网不出外网头像请求
- CMD_RATE_LIMIT_USER=10 # 登录/注册限流(默认值,显式声明)
- CMD_RATE_LIMIT_NEW_NOTES=20
# —— 运维 ——
- CMD_LOGLEVEL=info
- CMD_ENABLE_STATS_API=true # 保留 /status 供监控采集
逐组解读:位置组三项决定「链接长什么样、谁能跨域访问」;数据库与会话密钥是「丢了就要命」的两项(密钥换 = 全员登出);注册与权限组把实例从「开放维基」收敛为「实名知识库」——关闭自助注册后账号由管理员用命令行创建(逐条实测见 《HedgeDoc 1.12.0 常用 CLI 命令与工具详解》);安全组默认值之外仅关闭 iframe/PDF 嵌入与外网头像请求,属于官方推荐的低风险加固。
⚠️ 注意:此模板按「IP + 非标准端口」直连形态书写。若改为域名 + 反向代理 + HTTPS:
CMD_DOMAIN换域名、CMD_URL_ADDPORT删除(443 不拼端口)、CMD_PROTOCOL_USESSL=true、CMD_COOKIE_POLICY保持lax。
七、常见问题
Q1:启动日志出现 Session secret not set. Using random generated one...?
CMD_SESSION_SECRET 未设置(config.json 也没写 sessionSecret)。后果是每次重启全员登出(告警原文即说明)。实测该告警在最小 config.json 场景下必然出现(见 3.2 节回显)。解决:两轨任选一处设置固定密钥后重建服务。
Q2:应用日志反复出现 Database cannot be reached. Try N of 30. (SequelizeConnectionError: getaddrinfo EAI_AGAIN database)?
数据库不可达。HedgeDoc 启动时会重试 30 次(实测回显中 Try 1 of 30)。依次检查:数据库服务是否 Up(docker compose ps)、CMD_DB_URL 主机名/密码、数据库容器是否就绪。实测数据库恢复后应用自动完成迁移并监听端口,无需人工干预。
Q3:开了 CMD_URL_ADDPORT=true,分享链接里的端口却是 3000 而不是对外端口?
实测复现:宿主端口 8132 → 应用端口 3000 的映射下,CMD_URL_ADDPORT=true 生成的重定向是 http://192.168.146.128:3000/。原因:官方文档注明 URL 生成使用的是 CMD_PORT(应用监听端口),不是端口映射的外侧值。解决三选一:① 映射改为 3000:3000;② 设 CMD_PORT=8132 且映射 8132:8132;③ 域名 + 反代场景关掉 URL_ADDPORT(443/80 不需要拼)。
Q4:关闭邮箱注册后 /register 打不开?
这是预期行为:实测 CMD_ALLOW_EMAIL_REGISTER=false 后 POST /register 返回 404。此时创建账号的正规途径是命令行工具(bin/hedgedoc 的 users 子命令,见 CLI 篇),或临时开注册建完再关。
Q5:/status 突然 302 跳首页、监控采不到数?
CMD_ENABLE_STATS_API 被设为 false(实测该值会把 /status、/metrics 一起关闭并重定向)。监控需要数据就保持 true;公网实例若担心信息暴露,改在反代层对这两个路径做访问控制,而不是关端点。
Q6:改了环境变量没生效?
环境变量在启动时读取:必须 docker compose up -d(environment 有变化时会自动 Recreate)而非 restart(restart 不会应用新的 environment)。用 3.3 节三板斧验证。
八、参考链接
- 官方配置文档:https://docs.hedgedoc.org/configuration/
- 配置解析源码(环境变量):https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/environment.js
- 默认值定义源码:https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/default.js
- 1.12.0 发布说明:https://github.com/hedgedoc/hedgedoc/releases/tag/1.12.0
- 本专栏系列:《HedgeDoc 介绍与选型指南》、《HedgeDoc 1.12.0 Docker Compose 部署指南》、《HedgeDoc 1.12.0 常用 CLI 命令与工具详解》