HedgeDoc 1.12.0 配置参数详解

HedgeDoc 1.12.0 双轨配置体系(config.json 与 CMD_* 环境变量)逐项解析:官方默认值、实测行为与生产配置模板

HedgeDocHedgeDocMarkdown2026/10/22

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.jsv24.22.1
配置文档口径官方 configuration 文档(1.x/master 分支,2026-10-22 查证)
实测方式环境变量经 Docker Compose 注入;config.json 经文件挂载注入,观察启动日志与 HTTP 行为验证生效

二、前置条件

  1. 已按 《HedgeDoc 1.12.0 Docker Compose 部署指南》完成部署且 /_health 返回 {"ready":true};
  2. 知晓本文两条主线:环境变量(CMD_*)与 config.json 文件,两者任选其一或混用;
  3. 改动配置后需要重建应用服务才生效(环境变量是启动时读取的),验证手段统一为「启动日志 + /_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 生效验证三板斧(每改必验)

  1. 启动日志:docker compose logs --since 1m app,确认无 Session secret not set 类告警、无 config 解析报错;
  2. 健康端点:curl -s http://192.168.146.128:8132/_health → {"ready":true};
  3. 行为端点:改了什么就验什么(如改 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_USESSLdomain 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_IDSfreeURL false;最大长度 100000
安全(CSP/HSTS/限流)CMD_CSP_ENABLE、CMD_HSTS_ENABLE、CMD_RATE_LIMIT_USERcsp 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_LAGstats 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_LOGLEVELinfo日志级别:debug/verbose/info/warn/error。排障时临时调 debug
DEBUGfalse调试模式开关(config.json 键为 debug),输出更细日志
NODE_ENVproduction 或 development运行环境;官方镜像默认按 production 运行
CMD_TOOBUSY_LAG70事件循环滞后阈值(毫秒),超过则对连接限流(过载保护)
CMD_DOCUMENT_MAX_LENGTH100000单篇笔记最大字符数。超长内容会被拒绝保存

⚠️ 注意:官方镜像内置数据库驱动仅含 PostgreSQL;不要尝试把 CMD_DB_DIALECT 指向 sqlite/mysql——1.12.0 官方文档的安装矩阵只有 PostgreSQL。

5.2 网络与位置

参数(环境变量)官方默认值说明与实测
CMD_DOMAINnull对外主机名/IP,分享链接与回调基准。实测:设为 192.168.146.128 后注册/登录重定向均为 http://192.168.146.128/
CMD_PORT3000应用监听端口。官方文档特别注明:开启 urlAddPort 时 URL 生成也使用该值——实测证实(见本表 CMD_URL_ADDPORT 行)
CMD_HOST0.0.0.0监听网卡地址
CMD_URL_PATHnull子路径部署(如 www.example.com/hedgedoc)时填写
CMD_URL_ADDPORTfalse生成的链接是否拼接端口(80/443 不会拼)。实测:设 true 后登录重定向变为 http://192.168.146.128:3000/——拼的是 CMD_PORT(容器内 3000),不是宿主机映射端口 8132;即「非标准端口映射」场景下不能只靠它修链接(正确做法见本表 CMD_PORT 行与第七章 Q3)
CMD_PROTOCOL_USESSLfalse资源路径按 https 生成(反代 TLS 场景开启)
CMD_PATH无UNIX socket 监听路径(设置后忽略 host/port 监听)
CMD_ALLOW_ORIGIN无允许的跨域来源列表,需覆盖实际访问主机名

5.3 用户与权限

参数(环境变量)官方默认值说明与实测
CMD_ALLOW_ANONYMOUStrue允许匿名访问与匿名建笔记。实测:改 false 并重建后,未登录访问 /new 被重定向回首页(GET /new -> 302 redirect=http://192.168.146.128/),无法匿名新建
CMD_ALLOW_ANONYMOUS_EDITSfalse仅在匿名访问关闭时生效:允许「freely」权限笔记被访客编辑
CMD_ALLOW_EMAIL_REGISTERtrue邮箱自助注册开关。实测:改 false 后 POST /register 返回 404(注册端点关闭),用户表计数保持不变;已注册用户登录不受影响
CMD_EMAILtrue邮箱登录总开关(关掉后 allowEmailRegister 无效)
CMD_DISABLE_NOTE_CREATIONfalse设 true 禁止任何人新建笔记(只读站场景)
CMD_DEFAULT_PERMISSIONeditable新建笔记默认权限:freely/editable/limited/locked/protected/private
CMD_REQUIRE_FREEURL_AUTHENTICATIONfalsefreeURL 模式建笔记是否要求登录
CMD_SESSION_SECRET无(每次启动随机生成)会话 Cookie 签名密钥。实测:未设置时启动日志必现告警 Session secret not set. Using random generated one. … All users will be logged out.——必须设置固定值
CMD_SESSION_LIFE1209600000(14 天)会话有效期(毫秒)

5.4 笔记与内容

参数(环境变量)官方默认值说明
CMD_ALLOW_FREEURLfalse允许「访问不存在的笔记 URL 即创建」,Etherpad 式用法;团队习惯固定知识库名称时可开启
CMD_FORBIDDEN_NOTE_IDS['robots.txt','favicon.ico','api','build','css','docs','fonts','js','uploads','vendor','views']保留路径,禁止被 freeURL 抢注为笔记名
CMD_EXTERNAL_LINK_WARNINGtrue外链跳转警告页(经 /_link 中转)。实测:1.12.0 发布说明明确本版起笔记内链接一律新标签页打开
CMD_EXTERNAL_LINK_WHITELIST[]免警告白名单主机,如 example.com,trusted.org,*.example.org
CMD_ALLOW_GRAVATARtrue头像源(Libravatar)。内网/隐私场景设 false
CMD_IMAGE_UPLOAD_TYPEfilesystem图片存储:filesystem/imgur/s3/minio/azure/lutim
CMD_ENABLE_UPLOADSall上传权限:all(含访客)/registered/none;未设置且匿名全关时自动取 registered

5.5 安全(CSP / HSTS / 限流 / Cookie)

参数(环境变量)官方默认值说明
CMD_CSP_ENABLEtrueContent-Security-Policy 头开关(官方不建议关闭)
CMD_CSP_ADD_DISQUS / CMD_CSP_ADD_GOOGLE_ANALYTICSfalse放行 Disqus/Google Analytics(官方不建议,扩大 XSS 面)
CMD_CSP_ALLOW_FRAMINGtrue是否允许 iframe 嵌入本站(官方强烈建议关闭)
CMD_CSP_ALLOW_PDF_EMBEDtrue是否允许 PDF 内嵌(官方建议关闭)
CMD_CSP_REPORTURI无CSP 违规上报地址
CMD_HSTS_ENABLEtrueHSTS(需 HTTPS 生效才起作用)
CMD_HSTS_INCLUDE_SUBDOMAINSfalseHSTS 覆盖子域
CMD_HSTS_MAX_AGE31536000HSTS 有效期(一年,秒)
CMD_HSTS_PRELOADfalse允许 HSTS 预加载列表
CMD_COOKIE_POLICYlaxSameSite 策略:lax/strict/none(none 且无 https 会直接破坏编辑器)
CMD_RATE_LIMIT_USER10每用户每 5 分钟登录/注册类操作上限(0 关闭)
CMD_RATE_LIMIT_NEW_NOTES20每用户每 5 分钟新建笔记上限(0 关闭)
CMD_RATE_LIMIT_USING_CLOUDFLAREfalse经 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/ADCMD_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/OIDCCMD_OAUTH2_CLIENT_ID/CLIENT_SECRET/AUTHORIZATION_URL/TOKEN_URL/USER_PROFILE_URL/SCOPE/PKCE 等通用 OAuth2;CMD_OAUTH2_SCOPE 默认 openid email profile
SAMLCMD_SAML_IDPSSOURL、CMD_SAML_IDPCERT、CMD_SAML_IDENTIFIERFORMAT 等名称格式默认 urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
GitHubCMD_GITHUB_CLIENTID/CMD_GITHUB_CLIENTSECRETOAuth App 注册后填入
GitLabCMD_GITLAB_BASEURL、CMD_GITLAB_CLIENTID、CMD_GITLAB_CLIENTSECRET、CMD_GITLAB_VERSION(默认 v4)自建 GitLab 填 BASEURL
GoogleCMD_GOOGLE_CLIENTID/CMD_GOOGLE_CLIENTSECRET/CMD_GOOGLE_HOSTEDDOMAIN限制组织域时填 hostedDomain
Mattermost/Dropbox/Facebook/TwitterCMD_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 时需同步配置对应密钥组:

存储关键环境变量默认值
S3CMD_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)均无
MinIOCMD_MINIO_ACCESS_KEY、CMD_MINIO_SECRET_KEY、CMD_MINIO_ENDPOINT、CMD_MINIO_PORT(9000)、CMD_MINIO_SECURE(true)均无
Azure BlobCMD_AZURE_CONNECTION_STRING、CMD_AZURE_CONTAINER均无
imgurCMD_IMGUR_CLIENTID无
lutimCMD_LUTIM_URLhttps://framapic.org/

如何选:单机小团队用默认 filesystem(配合 uploads 目录持久化,见部署篇)即可;图片量大或多实例共享存储时选 MinIO/S3。CMD_MINIO_SECURE 默认 true,对接内网自建 MinIO(无 TLS)必须显式设 false,这是最常见踩坑点。

5.8 运维可观测

参数(环境变量)官方默认值说明与实测
CMD_ENABLE_STATS_APItrue/status 与 /metrics 端点开关。实测:设 false 后 GET /status 返回 302 重定向回首页(端点关闭),恢复 true 后重新返回 JSON 状态
CMD_SOURCE_URL无入口页展示的源码链接(魔改版必须填写,AGPL 合规要求)
CMD_LOGLEVELinfo见 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 节三板斧验证。

八、参考链接

  1. 官方配置文档:https://docs.hedgedoc.org/configuration/
  2. 配置解析源码(环境变量):https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/environment.js
  3. 默认值定义源码:https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/default.js
  4. 1.12.0 发布说明:https://github.com/hedgedoc/hedgedoc/releases/tag/1.12.0
  5. 本专栏系列:《HedgeDoc 介绍与选型指南》、《HedgeDoc 1.12.0 Docker Compose 部署指南》、《HedgeDoc 1.12.0 常用 CLI 命令与工具详解》