Skip to content

config.yaml 配置详解 ​

config.yaml 是灵萌后端服务启动时读取的配置文件,位于项目根目录(与可执行文件同级)。它决定服务怎么连数据库、怎么限流、定时任务多久跑一次、日志保留几天等基础设施行为。

修改后必须重启

config.yaml 里的改动不会热更新,改完后需要重启 Go 进程(或 systemd / Docker 容器)才会生效。

与「管理后台系统配置」的区别

配置来源文件 / 入口谁改典型内容
启动级根目录 config.yaml运维 / 开发数据库、Redis、JWT、限流、定时任务
运行期管理后台 → 系统设置 → 系统配置运营微信 AppID、支付商户号、短信、地图 Key

本文档只讲 config.yaml。后台各 Tab 说明见 系统配置总览。

文件从哪里来? ​

  1. 首次启动:若根目录没有 config.yaml,程序会把内置模板 default_config.yaml 复制一份出来。
  2. 每次启动:现有 config.yaml 会与内置模板自动对齐——补全新增字段、删除已废弃字段,你手改的值会保留。
  3. 初始化向导:访问 /setup 完成后,数据库、Redis、JWT 等敏感项会写入 config.yaml。

配置总览(按重要性) ​

配置块一句话说明生产必配
app端口、域名、环境、雪花 ID是
databaseMySQL 连接与分库分表是
redis缓存、队列、限流、分布式锁是
jwt / security登录令牌与敏感数据加密是
serverHTTP 超时、API 前缀、请求体大小建议
task定时任务开关、清理天数、各任务周期建议
cors跨域白名单是
rate_limit全站接口防刷建议
log日志目录、慢请求、轮转建议
queue异步任务消费者是
meilisearch / gorse / nebula搜索与推荐外部服务按需
recommend推荐算法参数按需
health_center / prometheus / tracing监控与自愈按需

app — 应用基础 ​

控制服务叫什么、监听哪个端口、对外域名是什么。

字段类型默认值说明
name字符串lingmeng服务名称,用于日志标识、追踪 service_name 兜底等
version字符串2.0.0历史遗留展示字段,实际运行版本以编译注入为准
env字符串prod运行环境:prod 会启用更严格校验;本地开发请设为 local
port数字8080HTTP 监听端口
domain字符串http://localhost:8080对外访问地址(含 https://),用于生成回调链接、分享链接等
setup_completed布尔false是否完成 /setup 初始化向导;未完成会引导去配置
worker_id数字 0~1023自动分配雪花 ID 生成器的机器编号;多实例裸机部署建议每台不同
instance_id字符串自动生成进程实例标识,格式一般为 hostname-pid,便于日志区分

环境变量覆盖:

  • LM_WORKER_ID → 覆盖 worker_id(优先级最高)
  • LM_INSTANCE_ID → 覆盖 instance_id

常见场景:

  • 单机部署:worker_id 可不填,自动分配即可。
  • 多实例同机/多机:每台实例配置不同的 worker_id,否则可能产生重复 ID。

database — MySQL 数据库 ​

字段默认值说明
host空数据库主机
port3306端口
username空用户名
password空密码(建议用 LM_DATABASE_PASSWORD 环境变量)
db_name空数据库名
charsetutf8mb4字符集,支持 emoji 必须用 utf8mb4
parse_timetrue是否把 MySQL 时间解析为 Go 的 time.Time
locLocal时区,常用 Local 或 Asia/Shanghai
max_idle_conns10连接池最大空闲连接数
max_open_conns50连接池最大打开连接数,按 QPS 与 MySQL max_connections 调整
conn_max_lifetime_minutes60单连接最长存活时间(分钟),应小于 MySQL wait_timeout
conn_max_idle_time_minutes10空闲连接最长存活时间,避免拿到已断开的连接
skip_auto_migratefalsetrue = 启动时不跑 GORM AutoMigrate;生产建议 true,改走 SQL 迁移
run_sql_migrations_on_startuptrue启动时执行内嵌 SQL 迁移脚本

database.read_replica — 读写分离 ​

字段说明
enabled是否把 SELECT 路由到读库;写操作和事务仍走主库
host / port读库地址;留空则与主库相同(单机开发)
dsn完整读库 DSN,设置后覆盖 host/port 拼接
max_idle_conns 等读库连接池参数;0 表示沿用主库配置

database.shard — 水平分表 ​

字段说明
enabled是否启用分表;开启后 messages 按 conversation_id、notifications 按 user_id 分桶
message_buckets消息表分桶数,默认 512
notification_buckets通知表分桶数,默认 512

database.multidb — 垂直拆库 ​

字段说明
enabled是否把日志、归档、资金等表路由到独立数据库
log_db_name日志库名,如 lingmeng_log(存放 message_delivery_traces、各类 outbox 日志等)
archive_db_name归档库名
fund_db_name资金库名
fund_writes_on_primary资金相关写操作是否仍留主库(需与余额同事务时为 true)

database.topology — 拓扑切换 ​

字段说明
auto_backfill启用 shard/multidb 后是否自动回填历史数据
purge_source_after_backfill回填完成后是否删除源表数据
partition_auto_apply是否自动应用分区维护

环境变量: LM_DATABASE_HOST、LM_DATABASE_PORT、LM_DATABASE_USERNAME、LM_DATABASE_PASSWORD、LM_DATABASE_NAME


redis — 缓存与队列 ​

字段默认值说明
host空Redis 主机
port6379端口
password空密码
db0逻辑库编号
pool_size50连接池大小
min_idle_conns10最小空闲连接,减少突发时建连延迟

Redis 用于:接口缓存、限流计数、分布式锁、Asynq 消息队列、WebSocket 在线状态等。几乎所有生产部署都必须配置 Redis。

环境变量: LM_REDIS_HOST、LM_REDIS_PORT、LM_REDIS_PASSWORD、LM_REDIS_DB


cache — 缓存前缀 ​

字段说明
prefix所有 Redis Key 的统一前缀,默认 lingmeng。多套环境共用同一 Redis 时必须改成不同前缀
del_prefix_physical_scan版本号变更时是否 SCAN 物理删除旧 Key;默认 false(靠 TTL 自然过期)。内存紧张且无 TTL 时可开 true

log — 日志 ​

字段默认值说明
base_dirstatic/logs日志根目录,按日期分子目录 YYYY-MM-DD/
consoletrue是否同时输出到控制台;生产建议 false,由日志采集器读文件
jsontrue是否 JSON 格式,便于 ELK / Loki 检索
slow_threshold_ms3000慢请求阈值(毫秒),超过写入 slow.log
access_asynctrue访问日志是否异步写,降低请求延迟
access_queue_size4096异步访问日志队列长度
max_size_mb100单文件最大体积,超过后轮转
max_backups10每天每类日志最多保留几个备份文件
audit_body_max_bytes65536审计日志记录请求体的上限,超过只记「已跳过」

server — HTTP 服务 ​

字段默认值说明
read_timeout_seconds15读取完整请求的最长等待时间
read_header_timeout_seconds5读取请求头的超时,应小于 read_timeout_seconds
write_timeout_seconds60写出响应的最长等待;有大文件上传/下载时可适当加大
idle_timeout_seconds120Keep-Alive 空闲连接保留时间
max_header_bytes1048576请求头最大 1MB
api_prefix/api所有业务 API 的统一前缀。改成 /backend-api 后,健康检查变为 GET /backend-api/ping。不影响 /ws 等独立路由
shutdown_timeout_seconds0优雅关闭等待秒数;0 = 使用 write_timeout + 30
brotli_enabledfalseGin 层 Brotli 压缩;生产通常由 Nginx/CDN 压缩,保持 false 即可
brotli_quality4压缩质量 1~11
brotli_min_length4096小于该字节数的响应不压缩
max_request_body_bytes4194304JSON 请求体上限 4MB;multipart 上传走 upload 段

使用 CDN 或反向代理时

若限流、登录日志里的客户端 IP 全部变成 CDN 出口 IP,请联系技术支持协助调整可信代理网段配置。


websocket — 实时连接 ​

字段默认值说明
max_global_connections20000单进程 WebSocket 连接上限,防止文件描述符耗尽
max_connections_per_user5单用户最多几个并发连接(手机+电脑等),超出踢最旧的
presence_redis_timeout_ms800在线状态写 Redis 的超时,应远小于 Redis 读超时

startup — 启动模式 ​

字段说明
strict_dependencies严格依赖检查;app.env=prod 时框架会强制开启,核心依赖连不上直接退出
mode启动模式,见下表
worker_health_portworker 模式下的健康检查端口,默认 9090
generate_swagger_on_start启动时是否重新生成 Swagger;生产务必 false
mode 值含义
full完整模式:HTTP + 定时任务 + 队列消费者(默认)
http_only只提供 HTTP API,不跑定时任务和队列
worker只跑后台任务,不监听 HTTP
admin_only预留的管理端独立部署,当前与 http_only 相同

环境变量: LM_STARTUP_MODE(优先级高于配置文件)

多实例部署示例:

  • API 实例 × N:mode: http_only 或 full,task.enabled: false(若不想重复跑定时任务)
  • Worker 实例 × 1:mode: worker,专门跑定时任务和队列

cors — 跨域 ​

字段说明
allowed_origins允许的前端域名列表;生产禁止 *,应写具体域名如 https://admin.example.com
allowed_headers允许的请求头
allowed_methods允许的 HTTP 方法
allow_credentials是否允许携带 Cookie;与 allowed_origins: "*" 通常不兼容
max_age_seconds浏览器缓存预检 OPTIONS 结果的秒数

queue — 异步消息队列 ​

基于 Redis 的 Asynq 队列,处理发通知、刷新缓存、导出等耗时操作。

字段默认值说明
enabledtrue队列消费者总开关;关闭后异步任务只入队不消费
concurrency10同时处理多少个任务;按 CPU 和 Redis 性能调整,不宜过大

upload — 上传限制 ​

字段说明
max_multipart_memory_mb表单解析在内存中保留的上限,超出部分写临时文件
max_file_size_mb单文件大小兜底上限(后台「功能与上传」可覆盖)
media_command_timeout_secondsffmpeg/ffprobe 等媒体命令最长执行时间

meilisearch — 全文搜索 ​

字段说明
enabled是否启用;false 时搜索降级为 MySQL FULLTEXT
host服务地址,如 http://127.0.0.1:7700
api_keyAPI 密钥
timeout_seconds请求超时
degrade_seconds连续失败后的降级窗口,窗口内直接走 MySQL

gorse — 推荐引擎 ​

字段说明
enabled是否启用 Gorse 协同过滤推荐
base_urlGorse API 地址
api_keyAPI 密钥
timeout_seconds / read_timeout_ms请求超时
degrade_seconds失败降级窗口
readiness_cache_seconds就绪状态缓存秒数
item_to_item_recommender物品相似推荐算法名
user_to_user_recommender用户相似推荐算法名
non_personalized_recommender非个性化推荐(如热门)算法名

nebula — 图数据库 ​

用于「共同好友」等社交图查询。

字段说明
enabled是否启用
host / port服务地址,默认 9669
username / password登录账号
space图空间名称
timeout_seconds连接超时

rate_limit — 全局限流 ​

字段默认值说明
enabledtrue全站 API 限流开关
sceneapi限流场景标识,用于 Redis Key 拼接
window_seconds60统计窗口(秒)
limit300窗口内同一标识最多请求次数
identifierip限流维度,当前支持 ip

rate_limit_scenes — 场景化限流 ​

在全局限流之上叠加更细的策略。每个场景结构相同:

子字段说明
enabled是否启用该场景
window_seconds统计窗口
limit窗口内最大次数
identifierip / user_id / bearer(MCP Token)
场景名保护什么
login密码登录防爆破
captcha验证码获取
register注册
otp短信/邮箱验证码发送
password_reset找回密码
ai / ai_generate / ai_async_jobAI 接口
payment / payment_create支付
withdraw_apply提现申请
ws_ticket / ws_connectWebSocket
mcp_callMCP 工具调用
admin_dangerous后台高危操作
write发笔记、评论、点赞等写操作
open_stream_events / open_stream_notes对外开放的内容流 API

ip2region — 离线 IP 归属地 ​

当后台「阿里云 → IP 归属地接口」选 ip2region 时使用。

字段说明
v4_xdb_pathIPv4 离线库路径
v6_xdb_pathIPv6 离线库路径
searcher_pool_size查询器连接池大小

task — 定时任务 ​

这是运维最常改的配置块之一。

顶层字段 ​

字段默认值说明
enabledtrue定时任务总开关;多实例时通常只在一台实例开启
run_on_startfalse启动后是否立即跑一遍所有任务(不等第一个周期)
log_retain_days7日志目录保留天数;0 = 永不清理
data_retention见下表数据库表数据保留天数
default—所有任务的默认治理策略
jobs—按任务名覆盖单个任务的参数

task.data_retention — 数据保留天数 ​

由 system.data_retention_cleanup、notification.cleanup、system.activity_cleanup 等任务使用。设为 0 表示不清理对应数据。

字段默认清理什么
message_delivery_traces_days30消息推送链路追踪(排障日志,数据量大)
notification_read_days90已读站内通知
activity_days90系统动态(system_activities)
business_event_outbox_terminal_days30已成功/已忽略的业务事件 outbox
business_event_outbox_dead_days90已死亡的 dead 状态 outbox
notify_outbox_sent_days14已发送的通知 outbox
task_event_outbox_success_days7已成功的用户任务 outbox
recommend_events_days90推荐埋点事件
note_popularity_logs_days90笔记热度计算流水
ai_call_logs_days180AI 调用日志
mcp_call_logs_days180MCP 调用日志
user_login_logs_days365用户登录日志
user_security_logs_days365用户安全日志(改密、绑定等)

磁盘占用大时怎么调?

若 message_delivery_traces 或 notifications 表过大,可优先缩短 message_delivery_traces_days(如 7)和 notification_read_days(如 30),重启后等待清理任务执行(默认每 6 小时)。

task.default — 任务默认策略 ​

字段默认值说明
timeout_seconds600单次任务最长执行时间(秒),超时会被取消
lock_enabledtrue多实例时是否用 Redis 分布式锁,避免重复执行
lock_ttl_seconds0锁 TTL;0 = 按超时或执行周期自动推导

task.jobs — 单任务配置 ​

在 jobs 下用任务名作为 Key。常用可配字段:

字段说明
enabled是否启用该任务
interval_seconds执行间隔(秒)
timeout_seconds单次超时
lock_enabled是否加分布式锁
run_on_start启动时是否立即执行一次
batch_size每批处理条数(分批任务)
max_items_per_run单轮最多处理条数,0 = 任务内置预算

主要定时任务一览:

任务名默认间隔做什么
system.log_cleanup1 小时清理过期日志目录
system.tmp_cleanup30 分钟清理 static/tmp 临时文件
system.data_retention_cleanup6 小时按 data_retention 清理各类日志表
system.health_check5 分钟巡检 outbox 积压、队列深度、连接池、内存
system.activity_cleanup1 天清理过期系统动态
notification.cleanup6 小时清理过期已读通知
event.business_event_outbox5 秒消费业务事件 outbox
user.task_event_outbox30 秒消费用户任务 outbox
lottery.auto_draw1 分钟抽奖到期自动开奖
note.hot_refresh1 小时刷新笔记热度
recommend.gorse_sync30 分钟同步数据到 Gorse
message.archive1 天私信冷归档
order.reconcile10 分钟订单资金对账
fund.reconcile10 分钟资金流水对账
search.rebuild30 天搜索索引全量重建(运维兜底)

system.health_check 还可单独配置告警阈值:outbox_business_warn、queue_depth_warn、db_pool_saturation_ratio 等。


forbidden_word — 违禁词(种子配置) ​

字段说明
enabled是否开启违禁词检测
default_actionreject 拒绝 / mask 掩码 / log_only 仅记录
mask_char掩码替换字符
min_word_len词表加载时忽略短于此长度的词

INFO

运行期策略以数据库 forbidden_word_settings 为准;此处只是首次种子。日常维护请用 全局违禁词 后台页面。


captcha — 验证码 ​

字段说明
master_code万能验证码;生产环境必须留空。仅本地开发可在自建 config.yaml 中设置

login_lockout — 登录防爆破 ​

字段默认值说明
enabledtrue是否启用
max_attempts5窗口内最多失败几次
lockout_seconds900锁定多久(秒),默认 15 分钟
window_seconds900失败计数窗口

jwt — 登录令牌 ​

字段说明
secretJWT 签名密钥,生产必须强随机;用 LM_JWT_SECRET 环境变量覆盖
expire_hoursToken 有效期(小时),默认 72

security — 敏感数据加密 ​

字段说明
secret_keyAES-GCM 加密密钥(微信 Token、AI API Key 等);LINGMENG_SECRET_KEY 或向导配置
file_signature_secret私有文件短期访问链接的 HMAC 密钥;LM_FILE_SIGNATURE_SECRET

admin_security — 管理后台安全 ​

字段说明
ip_whitelist_enabled是否只允许白名单 IP 访问后台
allowed_ips白名单 IP 列表;超级管理员不受限
max_concurrent_sessions每管理员最多几个并发会话;0 = 不限制

tracing — 分布式追踪 ​

字段说明
enabled是否启用 OpenTelemetry;app.env=local 时未配置则默认开启
service_name服务名,留空用 app.name
otlp_endpointOTLP 采集端地址,如 localhost:4318
otlp_insecure是否明文 HTTP
sample_ratio采样率 0~1;生产高流量可降到 0.1~0.3

health_center — 服务健康中心 ​

自动探活、渐进式自愈、必要时触发进程重启(需配置 process_manager)。

字段说明
enabled总开关
interval_seconds探活间隔,默认 10 秒
recovery_window_seconds恢复观察窗口
heal.max_attempts自愈最大尝试次数
heal.attempt_interval_seconds自愈重试间隔
restart.enabled是否允许自动重启
restart.cooldown_seconds两次重启之间的冷却时间
restart.process_managersystemd / docker / k8s 等
mysql.* / redis.* / api.*各维度故障判定阈值

reconcile — 对账告警 ​

字段说明
alert_critical_enabledcritical 级差异是否写入系统动态 + Prometheus
auto_fix_enabled对账任务是否自动修复可修复项
auto_fix_max_per_run每轮最多自动修复条数

feature_flags — 特性开关 ​

YAML 提供默认值,可在数据库中动态覆盖。

字段说明
enabled是否启用特性开关系统
cache_ttl_seconds开关值缓存秒数
defaults.*各功能默认开/关,如 store、membership、ai.multimodal 等

prometheus — 指标暴露 ​

字段说明
enabled是否暴露 /metrics;local 环境默认开启
path指标路径,默认 /metrics(不受 api_prefix 影响)
namespace指标名前缀,如 lingmeng_http_requests_total

recommend — 推荐系统 ​

总开关 enabled;下设多个子模块,常用项:

子块作用
feed信息流推荐条数、Gorse 召回倍数、热门兜底
user_recommend「聊得来的人」:共同好友 + 兴趣相似 + 浏览标签
related笔记相关推荐:文本/话题/圈子/ItemCF 权重与缓存
embedding向量召回:模型、维度、相似度阈值
itemcf物品协同过滤离线权重
ltr学习排序:样本天数、训练轮数、标签权重
rerank重排:MMR 多样性、同作者/同话题上限
abA/B 实验默认变体与流量比例
metrics推荐效果基线采样
gorse_sync同步到 Gorse 的批量大小

具体数值含义见各字段旁注释;调优前建议先在测试环境观察 CTR 与延迟。


llmchat — AI 对话 ​

字段说明
stream_timeout_seconds流式 SSE 超时,应小于 server.write_timeout_seconds

storage — 本地文件存储 ​

字段说明
base_dir上传文件保存目录
public_prefix对外 URL 前缀
x_accel_redirect_prefixNginx 内部静态路径;配置后由 Nginx 直接发文件,减轻 Go 压力

云存储(COS/OSS/七牛)在管理后台 → 系统配置 → 文件存储配置,不在 config.yaml。


环境变量速查 ​

部署时建议密钥全部用环境变量,避免明文写入磁盘:

环境变量对应配置
LM_DATABASE_HOSTdatabase.host
LM_DATABASE_PORTdatabase.port
LM_DATABASE_USERNAMEdatabase.username
LM_DATABASE_PASSWORDdatabase.password
LM_DATABASE_NAMEdatabase.db_name
LM_REDIS_HOSTredis.host
LM_REDIS_PORTredis.port
LM_REDIS_PASSWORDredis.password
LM_REDIS_DBredis.db
LM_JWT_SECRETjwt.secret
LM_FILE_SIGNATURE_SECRETsecurity.file_signature_secret
LM_STARTUP_MODEstartup.mode
LM_WORKER_IDapp.worker_id
LM_INSTANCE_IDapp.instance_id

常见问题 ​

改了 config.yaml 没生效? ​

必须重启进程。可对照日志里启动时打印的配置项确认是否加载。

多实例部署定时任务跑重复了? ​

确保只有一台实例 task.enabled: true,或依赖 lock_enabled: true(默认开启)的 Redis 分布式锁。

数据库表越来越大怎么办? ​

优先调整 task.data_retention,尤其是 message_delivery_traces_days 和 notification_read_days。详见上文 数据保留天数。


相关文档 ​

灵萌 Lingmeng 使用手册