配置说明
约 1629 字大约 5 分钟
2026-09-15
加载顺序
config/default_config/*.yaml 随仓库提供的默认值
↓ 首次启动(或文件缺失时)复制
config/config/*.yaml 用户配置,只改这里读取时 cfg.bot / cfg.getGroup() 这类属性是默认配置与用户配置的合并结果, 所以用户文件里没写的键会取默认值——但不会改写你的文件,缺项是靠合并补的。
config/config/ 里的文件不入库(可能含账号凭据)。删除某个文件后,下次读取会从 default_config 重建一份默认的(文件级自愈),不会影响其它文件。
文件一览
| 文件 | 内容 |
|---|---|
bot.yaml | 日志、消息记录、加载超时、文件监听、定时任务、文件托管、chromium 路径 |
jiuli.yaml | 框架专属:兼容开关、Redis 降级、性能选项 |
other.yaml | 主人、好友/群邀请自动处理、私聊开关、黑白名单 |
group.yaml | 群聊冷却、回复策略、enable / disable 功能开关 |
server.yaml | HTTP 服务地址、端口、跳转地址、鉴权、HTTPS |
redis.yaml | Redis 连接信息 |
db.yaml | Sequelize 数据库(默认 SQLite:data/db/data.db) |
renderer.yaml | 渲染后端选择(留空为自动) |
pm2.yaml | pm2 应用配置 |
另外,插件自己用 makeConfig / useConfig 生成的配置会落在 config/<插件名>.yaml。
常用项
bot.yaml
log_level: info # trace / debug / info / warn / fatal / mark / error / off
log_msg: true # 记录消息收发内容(收 ◀ / 发 ▶)
log_msg_length: 60 # 日志里的消息预览长度
log_align: " JiuLi " # 日志左列的宽度(这一列显示来源模块名,没有来源的日志显示框架名)
log_dedupe: 10 # 同一条日志在这个秒数内重复出现时,终端只留一条 + 折叠计数(文件仍完整;0 关闭)
no_handler_tip: false # 命中规则但插件没响应时补一句提示(默认关;开启也只对指令前缀开头的消息提示)
no_handler_tip_prefix: "#" # 上面那条提示认的指令前缀,多个用逗号分隔;写 * 表示不限制前缀
plugin_load_timeout: 60 # 单个插件加载超时(秒)
reload_restart_on_error: true # 热重载时模块初始化失败(循环 import + 顶层副作用撞 TDZ)自动重启恢复(两分钟内只重启一次)
file_watch: true # 监听插件目录,自动热重载(关掉后靠 #重载 或重启)
update_cron: # 定时更新(cron)
restart_cron: # 定时重启
chromium_path: # 指定浏览器路径
puppeteer_ws: # 复用已有浏览器的 ws 地址日志形如 05:15:40.077 INFO [ Plugin ] 插件 247 个 · …:第二列是等级(按级别配色), 第三列是来源 —— 框架内部按模块名区分(Plugin / Msg / Render / Redis…), 插件里直接 logger.info(...) 这类没有来源的日志统一显示框架名 JiuLi。
关于 no_handler_tip(默认 false,即不提示):打开后,只有以 no_handler_tip_prefix 开头(默认 #)的消息才会提示。插件常常用 ^[\s\S]+$、^.+$ 这种宽泛规则命中普通聊天, 聊天时插件本来就不该回话,不加前缀限制的话「随便聊一句机器人就回一句没有响应」, 比不提示更烦人。想出「无 # 的指令也有提示」的效果,把它设成 *。 同一个人的提示有 10 秒节流,不会连发。
插件反复刷同一条日志时(例如 QQBot 适配器的「被动回复失败」),终端只会留第一条, 后面折叠成一行计数:
17:11:20.237 WARN [ JiuLi ] 被动回复失败(code(40034128)),正在尝试通过主动消息发送
17:11:24.003 WARN [ JiuLi ] ↑ 相同内容 4 秒内重复 5 次,已折叠(完整日志见 logs/)logs/jiuli.<日期>.log 里每一条都还在,排查不受影响;log_dedupe: 0 可关掉折叠。
调试时把 log_level 调到 debug,能看到插件加载明细、事件候选、渲染参数。
jiuli.yaml
compat:
spoof_yunzai: false # 插件伪装模式,见下
framework_version: "3.1.3" # 对外版本号(老插件用它做功能门禁)
globals: true # 注入 Bot / logger / redis / segment / Renderer / plugin
runtime: true # 给 e 注入 runtime(懒加载)
redis_fallback: true # Redis 不可用且 hosts 为本机时降级为内存实现
perf:
metrics: true # 插件耗时统计
slow_plugin_ms: 3000 # 慢插件告警阈值(0 关闭)
count_flush_ms: 1000 # 消息计数写回间隔(0 = 实时写)
once_instance: true # accept 与 rule 复用同一插件实例
event_index: true # 按事件类型索引插件
load_concurrency: 4 # 插件并发导入数(插件多或内存小的机器建议 1~2)
reload_limit: 5 # 热重载熔断:插件自激重载达到这个次数就暂停它的重载监听(0 关闭)
reload_window: 60 # 上面那条的统计窗口(秒)
reload_global_limit: 12 # 一分钟内任何来源的重载超过这个数就打一条 ERROR 提醒(只告警不暂停,0 关闭)关于 spoof_yunzai:JiuLi 对外标识固定为 JiuLi,不可自定义。 少数插件会按框架名走分支,开启伪装后对外显示 trss-yunzai 并让它们走 TRSS 专属分支。 两者只能选一个,详见 兼容性。
group.yaml
default:
groupCD: 500 # 群聊指令冷却(ms)
singleCD: 2000 # 群聊个人冷却(ms)
onlyReplyAt: 0 # 0 全部响应 / 1 只响应 at 与前缀 / 2 非主人只响应 at
onlyReplyMaster: 0 # 1 = 只响应主人:非主人消息整层静默跳过(不触发插件、不回提示、不占冷却)
botAlias: [玖璃] # 触发前缀
enable: # 只启用列出的功能
disable: # 禁用列出的功能
114514:default: # 按 Bot 单独设置
123456: # 按群单独设置
114514:123456: # 按 Bot + 群设置onlyReplyMaster 和指令上的 permission: master 不是一回事:后者按指令声明、且会回一句"没有权限"; 前者是"谁能用这个机器人"的整层过滤,开启后非主人的消息什么都不回(私聊同样受约束)。 适合把机器人当私人助手用的部署;四个层级都能单独设,例如只对某个群开启。
server.yaml
url: http://localhost:1721
port: 1721
redirect: https://github.com/HL-z7/JiuLi # 访问根路径时的跳转
auth: # 可选:Bearer 鉴权
https: # 可选:证书与端口多实例隔离
用环境变量把两套实例完全隔开,互不干扰:
JIULI_CONFIG_DIR=config/b/ JIULI_PLUGINS_DIR=plugins-b/ node .测试脚本就是这么跑的(用 test/.tmp-* 目录),所以跑测试不会碰到你的真实配置。
配置文件被删的自愈
写配置前框架会先确保目录存在,文件缺失时从默认值重建,所以「误删 config/config/」这类操作 不会让实例直接崩掉。但正在运行的实例仍可能短暂报错,恢复后重启一次最稳。
