MeshCentral 1.3.1 配置参数详解
MeshCentral 1.3.1 主配置文件 config.json 逐项详解:settings/domains/smtp/letsEncrypt 分类精讲、_前缀注释与大小写行为实测、证书重生成机制、生产配置模板与常见配置故障排查。
MeshCentral 1.3.1 配置参数详解
目标:讲清 MeshCentral 主配置文件
config.json的组织结构、查看与修改方式、核心参数的分类语义与安全相关行为,并给出一份可直接落地的生产配置模板。参数语义以官方meshcentral-config-schema.json(master 分支,2026-10-27 查询)为准,关键行为(证书重生成、环境变量不写入、_前缀注释、meshctrl 配置动作)在 1.3.1 部署环境实测验证。部署过程见《MeshCentral 1.3.1 服务端 Docker Compose 部署指南》。
一、环境信息
- MeshCentral 版本:1.3.1(官方最新稳定版,Docker Compose 部署,实测环境与本文一致)
- 宿主系统:Ubuntu 22.04 LTS(x86_64)
- 配置文件路径:
/opt/meshcentral/data/config.json(数据目录 bind mount 视角;服务端内为/opt/meshcentral/meshcentral-data/config.json) - 参数溯源来源:官方配置 Schema
https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json(实测文件 209,723 字节,查询日期 2026-10-27);首启自动生成的 config.json 模板;官方 Wiki 配置文档 - 实测行为取证:修改
settings.cert重启(证书重生成范围)、meshctrl Config动作、首启日志回显(详见各节)
二、前置条件
- 已按部署指南完成 MeshCentral 服务端部署并能登录管理台(或使用 meshctrl 管理通道);
- 已获取官方 Schema 文件(推荐下载到本地,供编辑器校验):
curl -LO https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json
- 理解配置生效机制:config.json 位于 data 目录,服务端只在启动时读取一次,任何修改都需要重启服务端生效。
三、参数查看与修改方式
3.1 直接编辑 config.json(默认方式)
DYNAMIC_CONFIG=false(官方镜像默认)时,config.json 是唯一配置源。实测流程:
vi /opt/meshcentral/data/config.json
docker compose restart meshcentral # 或 systemctl restart meshcentral
实测确认的三条规则:
- 服务端不改写该文件:首启生成模板后,每次重启日志都回显
Pre-existing config found, not recreating...与Leaving config as-is. Dynamic Configuration is off.,手工编辑安全; _前缀 = 注释:JSON 不支持注释,MeshCentral 约定以_开头的键为「未启用项」,模板中_sessionKey、_letsencrypt整段都是示例;去掉_前缀即启用该参数;- 键名大小写不敏感:官方模板写的是
AllowFraming、WebRTC、AgentPong、SelfUpdate(混合大小写),而 Schema 中定义为allowFraming、webRTC、agentPong、selfUpdate,两种写法均正常生效——这是服务端读取配置时统一小写化处理的结果。
3.2 环境变量模式(DYNAMIC_CONFIG=true)
官方容器镜像支持以环境变量管理配置:设 DYNAMIC_CONFIG=true 后,HOSTNAME、ALLOW_NEW_ACCOUNTS、USE_MONGODB 等变量会在每次启动时动态生成 config.json。注意两种模式互斥:默认 false 模式下环境变量不写入 config.json(实测 HOSTNAME=meshcentral.lab.local 未生效,证书名称仍以 settings.cert 为准),必须改文件本身。变量清单见部署指南第六章。
3.3 meshctrl Config 动作
命令行工具 meshctrl 提供 Config 动作直接操作 config.json(工具安装见《MeshCentral 命令行工具 meshctrl 实战》):
$ meshctrl Config --show
实测要点:该动作读取执行命令时工作目录下的 ./meshcentral-data/config.json 本地文件(不走服务端通道),因此需在能直接看到 data 目录的机器上执行——容器部署时可在宿主机建一个指向 data 目录的软链 meshcentral-data:
cd /opt/meshcentral && ln -s data meshcentral-data
meshctrl Config --show # 实测:原样打印 config.json
meshctrl Config --listdomains # 列出非默认域名
在错误的目录执行时实测报错:
Unable to find config.json.
修改类子动作(同样作用于本地文件,改完需重启服务端):
meshctrl Config --adddomain "MyDomain" --title "My Server Name" --newAccounts false
meshctrl Config --settodomain "MyDomain" --themePack "Stylish-UI"
meshctrl Config --removefromdomain "MyDomain" --title
meshctrl Config --removedomain "MyDomain"
3.4 配置校验
config.json 首行的 $schema 指向官方 Schema,VS Code 等编辑器据此提供参数补全与类型校验;启动时配置不合法会在日志中明确报错并拒绝启用相关特性,属于「宁可启动失败也不静默错配」的取向。
四、参数总览
官方 Schema 的顶层配置节(实测统计,2026-10-27 master 版):
| 配置节 | 参数量 | 作用 |
|---|---|---|
settings | 124 项 | 服务端全局:端口、证书、数据库、会话、Agent 通道、代理等 |
domains | 每域 131 项 | 多域名站点:每个子站点独立的外观、注册、认证、功能开关 |
domaindefaults | — | 所有域的公共默认值(与 domains 同构) |
letsEncrypt | 8 项 | Let's Encrypt / ZeroSSL 自动证书 |
smtp | 12 项 | SMTP 邮件服务(通知、邮件验证、邀请) |
messaging | 8 类 | Telegram/Discord/XMPP/ntfy/Pushover/Slack/CallMeBot/Zulip 消息通知 |
sendmail / sendgrid / sms | — | 备选邮件通道与短信网关 |
peers | — | 多服务器互联(服务器间共享设备) |
本文第五章精讲日常运维高频参数;冷门参数以官方 Schema 描述为准。
五、核心参数分类详解
5.1 服务与端口(settings)
| 参数 | 类型/默认 | 说明 |
|---|---|---|
cert | string | 证书名称 = 服务端对外主名。首启据此签发自签名证书;实测修改后重启自动重签 HTTPS、代码签名、AMT MPS 三套证书(根证书与 Agent 证书保留,已上线 Agent 不受影响),日志先提示 Error: <新名> does not match name in TLS certificate: <旧名> 再重签 |
keepCerts | bool/false | 名称不匹配也强制沿用现有 HTTPS/MPS 证书(自定义证书场景) |
port | int/443 | HTTPS 主端口(Web 管理台 + Agent WebSocket 共用) |
portBind | string | HTTPS 端口绑定地址(多网卡场景收敛监听面) |
aliasPort | int | 对外呈现的主端口(反向代理映射后与内部不一致时设置) |
redirPort | int/80 | HTTP 重定向端口,0 关闭 |
redirAliasPort | int | 对外呈现的重定向端口 |
relayPort / relayDNS | int / string | Web 中继(WebRelay)独立端口或专用域名 |
agentPort | int | Agent 专用接入端口(与 Web 流量分离,需配套 agentAliasPort) |
agentPortTls | bool | Agent 专用端口是否启用 TLS |
exactPorts | bool/false | true 时端口被占直接失败,不自动尝试下一端口(排障友好) |
💡 说明:容器映射端口后,对 Agent 下发的连接地址来自
cert名称 +port(或aliasPort)。内网映射非标准端口(如部署指南的 8131→443)且设备从外部接入时,Agent 侧实际连接wss://<cert名>:443——容器网络内由网络别名解析;跨网段接入需让<cert名>:443真实可达,或用certUrl(见 5.5)指定下载与连接基准。
5.2 运行模式(settings)
| 参数 | 类型/默认 | 说明 |
|---|---|---|
WANonly | bool/false | 只启用广域网特性:Agent 全部按 DNS 名回连,关闭局域网组播发现 |
LANonly | bool/false | 只启用局域网特性:Agent 用组播包发现服务端,无需 DNS |
maintenanceMode | bool/false | 维护模式:仅管理员可登录(也可用服务端控制台 maintenance 命令切换) |
SelfUpdate | bool+string/false | true=每天凌晨自动自更新;设为版本号(如 "1.3.1")则启动时更新到指定版本。容器部署应保持 false,更新走「拉新镜像重建」 |
plugins.enabled | bool/false | 插件系统开关(官方镜像另有 ALLOW_PLUGINS 环境变量) |
5.3 会话与安全(settings)
| 参数 | 类型/默认 | 说明 |
|---|---|---|
sessionKey | string | Web 会话 Cookie 加密密钥。不设置则每次重启随机生成,所有用户登录态失效;多实例共享会话必须显式设置并保持一致 |
sessionTime | int/60 | 会话 Cookie 有效期(分钟) |
sessionSameSite | string/lax | Cookie SameSite 策略 |
cookieIpCheck | string/lax | 会话与来源 IP 的绑定检查强度 |
dbEncryptKey | string | NeDB 内置数据库的整体加密密钥 |
dbRecordsEncryptKey | string | 任意数据库下对记录中敏感字段(如设备凭据)的加密密钥 |
StrictTransportSecurity | bool+string | HSTS 头控制,默认 1 年 |
allowLoginToken | bool/false | 允许用登录令牌作为 URL 参数替代登录(配合嵌入场景) |
allowFraming | bool/false | 允许站点被 iframe 嵌套(默认禁止,防点击劫持;allowedFramingOrigins 可放行指定来源) |
lockAgentDownload | bool/false | 未登录用户禁止下载任何 Agent(含安装脚本与 /meshsettings 配置,公网部署建议开启) |
5.4 Agent 通道(settings)
| 参数 | 类型/默认 | 说明 |
|---|---|---|
AgentPong | int | 服务端向 Agent 定期发送心跳的间隔(秒),官方模板默认 300 |
agentPing | int | 心跳并要求 Agent 应答(更强连通性检测,NAT 超时环境按需调小) |
agentIdleTimeout | int/150 | Agent 无流量多少秒后断开连接 |
agentsInRam | bool | Agent 二进制全部载入内存,批量升级更快(内存换速度) |
noAgentUpdate | int | 1=禁止服务端更新任何 Agent(版本冻结) |
agentUpdateSystem | int | 2=Agent 升级走 meshcore 通道 |
ignoreAgentHashCheck | bool+string | Agent 忽略服务端证书校验(仅调试用,支持 IP 列表/网段) |
agentLogDump | bool | 自动回收 Agent 错误日志到 data 目录 |
agentCoreDump / agentCoreDumpUsers | bool / array | 自动收集 Agent 崩溃转储及查看权限 |
npmProxy | string | 服务端下载 npm 包与默认 Agent 时的 HTTP 代理(离线环境配合 agentbuilds 离线路径使用) |
agentDownloads | object | 指定 Agent 默认文件的 GitHub 下载源 |
5.5 反向代理与对外暴露(settings + domains)
| 参数 | 位置 | 说明 |
|---|---|---|
tlsOffload | settings | 前置 TLS 卸载器/反代时设 true,或设为代理 IP 列表(如 "127.0.0.1,192.168.1.100")以信任转发的 IP 头 |
trustedProxy | settings | 信任哪些来源的转发头(X-Forwarded-For 等),支持 "CloudFlare" 魔法值自动拉取 CF 网段 |
aliasPort / redirAliasPort | settings | 反代对外端口与内部不一致时设置,服务端按此生成对外的链接与 Agent 地址 |
certUrl | domains | 反代后 Agent 拉取证书/配置用的基准 URL(如 "https://mesh.example.com"),Agent 据此校验服务端 |
allowedOrigin | domains | 允许的 HTTP Origin 列表;false=按域名自动推断 |
5.6 数据库(settings)
| 参数 | 说明 |
|---|---|
| (默认) | 不配置即使用内置 NeDB(meshcentral.db 等文件),适合中小规模 |
mongoDb | MongoDB 连接串(如 "mongodb://user:pass@host:27017/meshcentral");mongoDbChangeStream/mongoDbBulkOperations 提升事件同步与批量写入性能 |
mariaDB | 对象形式 {host, port, user, password, database} |
postgres | 对象形式 {host, port, user, password, database} |
mySQL / sqlite3 / acebase | 其余可选后端(sqlite3 亦可填文件路径启用) |
dbExpire | 各类事件/统计在库内的保留秒数 |
💡 说明:切换外部数据库不迁移既有 NeDB 数据(需用导出工具或重新纳管)。大规模(数千设备)或需要高可用时选 PostgreSQL/MongoDB;容器镜像请配套选择
-postgresql/-mongodb变体或用全量镜像。
5.7 站点域名(domains)
domains 以域名为键,"" 即默认域名(访问根路径的站点)。高频参数(每域独立生效):
| 参数 | 类型/默认 | 说明 |
|---|---|---|
title / title2 | string | 站点主标题 / 右上角副标题 |
titlePicture / loginPicture | string | 450x66 顶栏 Logo / 登录页 Logo(PNG 放 data 目录,填文件名) |
welcomeText / welcomePicture | string | 登录页欢迎语 / 欢迎图 |
minify | bool | 下发压缩版前端页面(官方容器 MINIFY 默认 true,模板默认 false) |
NewAccounts | bool | 登录页开放注册(部署指南实测依赖它完成管理员注册) |
newAccountsPass | string | 注册口令(开放注册又防滥用的折中) |
newAccountsCaptcha | bool | 注册验证码 |
userNameIsEmail | bool | 用户名即邮箱 |
localSessionRecording | bool | 会话录像存于设备本地(默认 true) |
nightMode | int | 0=用户自选昼夜,1=恒夜间,2=恒日间 |
userSessionIdleTimeout | int | 空闲自动登出(分钟) |
userAllowedIP / userBlockedIP | array | 用户访问的来源 IP 白/黑名单(网段写法 "192.168.1.0/24") |
agentAllowedIP / agentBlockedIP | array | Agent 接入的 IP 白/黑名单 |
terminal / desktop / files | object | 终端/远程桌面/文件功能的子项(滚动、剪贴板、会话录制等细节开关) |
twoFactorCookieDurationDays | int | 2FA「记住此设备」天数 |
geoLocation / ipLocation | bool | 设备定位与地图展示 |
novnc / mstsc / ssh | bool | 内置 Web VNC / RDP 网关 / SSH 客户端开关 |
hide | int | 位掩码隐藏界面元素(1 头部、2 标签、4 页脚、8 标题…) |
footer / loginfooter | string | 登录后/登录前页脚(HTML) |
多域名:domains 下新增键即新增子站点(如 "mysite": {...},经 /mysite 路径访问;配 dns 参数可绑定独立域名)。domaindefaults 节为所有域的公共默认。
5.8 邮件与消息通知(smtp / messaging)
smtp(启用后支持邮件验证、设备上下线通知、邀请邮件、账号找回):
| 参数 | 默认 | 说明 |
|---|---|---|
host / port | — / 587(或 tls=true 时 465) | SMTP 服务器地址与端口 |
from | — | 发件人地址 |
user / pass | — | SMTP 认证凭据 |
tls | false | 连接即用 TLS(465 隐式 TLS 设 true;587 STARTTLS 保持 false) |
tlscertcheck / tlsstrict | — | 服务端证书校验开关 |
verifyemail | true | false=不校验邮箱格式与 MX 记录 |
emailDelaySeconds | — | 设备上下线通知的延迟合并窗口(防轰炸) |
name / auth | — | SMTP 客户端标识 / OAuth2 认证对象 |
messaging(设备上下线的即时通知与双因素登录推送):telegram(botId+token)、discord(url webhook)、xmpp、ntfy(boolean 或对象配置自建 ntfy)、pushover、slack、callmebot、zulip。用户在个人账号设置里绑定接收账号后生效。
5.9 Let's Encrypt 自动证书(letsEncrypt)
去掉整节的 _ 前缀并填入实际值即启用(需 80 端口公网可达,production 默认 false 先取测试证书):
| 参数 | 说明 |
|---|---|
email | 管理员邮箱(LE 账户,过期提醒) |
names | 证书 DNS 名列表,逗号分隔,首个为主名(应与 settings.cert 一致) |
production | false=Let's Encrypt 测试证书;true=正式证书 |
skipChallengeVerification | 跳过本地 HTTP-80 自检(反代环境) |
rsaKeySize | 密钥位数,默认 2048 |
nochecks | 跳过邮箱/域名有效性预检 |
zerossl | 改用 ZeroSSL 签发(对象配置) |
custom | 自定义 ACME 服务器 |
六、生产配置模板
以下模板整合本文高频参数(按内网域名 + SMTP 通知 + 关闭注册的收敛形态;证书名称、邮箱、密钥按实际替换):
{
"$schema": "https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json",
"settings": {
"cert": "mesh.example.com",
"port": 443,
"redirPort": 80,
"WANonly": true,
"sessionKey": "换成64位以上随机字符串",
"sessionTime": 480,
"AgentPong": 300,
"agentIdleTimeout": 150,
"exactPorts": true,
"lockAgentDownload": true,
"allowFraming": false,
"WebRTC": false,
"SelfUpdate": false,
"plugins": { "enabled": false }
},
"domains": {
"": {
"title": "运维管理台",
"NewAccounts": false,
"localSessionRecording": true,
"userSessionIdleTimeout": 30,
"welcomeText": "内部设备管理系统,账号请联系管理员开通",
"nightMode": 0
}
},
"smtp": {
"host": "smtp.example.com",
"port": 587,
"from": "meshcentral@example.com",
"user": "meshcentral@example.com",
"pass": "SMTP密码",
"tls": false,
"emailDelaySeconds": 60
},
"_letsEncrypt": {
"_comment": "公网部署时去掉本节 _ 前缀启用自动证书,names 需与 settings.cert 一致",
"email": "admin@example.com",
"names": "mesh.example.com",
"production": false
}
}
要点复核:sessionKey 必设(否则重启全员掉线);WANonly + NewAccounts: false + lockAgentDownload 是公网收敛三件套;exactPorts 让端口冲突在启动时显式报错;SMTP 启用后管理员可在「我的账号」开启设备上下线邮件通知。
七、常见问题
7.1 改了参数没有生效
按顺序检查:① 参数键是否带 _ 前缀(带 = 注释未启用);② 是否重启了服务端(配置仅启动时读取);③ DYNAMIC_CONFIG 模式确认——false 模式下环境变量全部无效(部署指南 4.5 节实测);④ 键名拼写(大小写不敏感但拼写必须准确,用编辑器 Schema 校验兜底)。
7.2 修改 settings.cert 后日志报 Error 且证书重生成
预期行为:先提示名称不匹配,再重签 HTTPS/代码签名/AMT MPS 三套证书;根证书不变,已上线 Agent 无感(部署指南 4.5 节实测,含 OpenSSL 输出)。想保留现有证书不重签可加 keepCerts: true。
7.3 每次重启后所有用户都要重新登录
未设置 settings.sessionKey,服务端每次启动随机生成会话加密密钥,旧 Cookie 全部失效。设置固定 sessionKey(随机长字符串)即可,多实例部署必须一致。
7.4 meshctrl Config --show 报 "Unable to find config.json."
该动作读的是本机当前目录下的 ./meshcentral-data/config.json,不经过服务端(5.3 节实测)。在 data 目录的父目录执行,或按 5.3 节建软链。
7.5 反向代理后 Agent 连不上或证书校验失败
反代改变了 Agent 看到的地址与证书链:设置 domains.""."certUrl" 指向对外 HTTPS 地址,配合 tlsOffload/trustedProxy 信任代理转发的头部,aliasPort 对齐对外端口。调试期可临时 ignoreAgentHashCheck,定位后务必关闭。
7.6 Let's Encrypt 签发失败
最常见原因:80 端口未放行(HTTP-01 挑战必须走 80)、names 与实际域名不符、production: false 拿到的是测试证书(浏览器仍报不可信)。反代环境可设 skipChallengeVerification: true 跳过本地自检。
八、参考链接
- 《MeshCentral 1.3.1 介绍与选型指南》(本专栏)
- 《MeshCentral 1.3.1 服务端 Docker Compose 部署指南》(本专栏)
- 官方配置 Schema(参数全集与权威描述):https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json
- 官方 Wiki 配置文档入口:https://github.com/Ylianst/MeshCentral/wiki
- MeshCentral GitHub 仓库:https://github.com/Ylianst/MeshCentral