Stoat 0.15.5 配置参数详解
把 Stoat 0.15.5 服务端的全部配置参数讲清楚——主配置 `Revolt.toml` 的每个配置段、密钥文件 `secrets.env` 的覆盖机制、语音配置 `livekit.yml` 与前端环境变量,并给出一份可直接套用的小型社区生产模板。参数默认值逐条对照后端源码 `crates/core/config/Revolt.toml` 核读,运行时行为在 2C8G 自托管实例实测验证。
Stoat 0.15.5 配置参数详解
目标:把 Stoat 0.15.5 服务端的全部配置参数讲清楚——主配置
Revolt.toml的每个配置段、密钥文件secrets.env的覆盖机制、语音配置livekit.yml与前端环境变量,并给出一份可直接套用的小型社区生产模板。参数默认值逐条对照后端源码crates/core/config/Revolt.toml核读,运行时行为在 2C8G 自托管实例实测验证。
一、环境信息
本篇参数说明基于以下环境(与部署篇同一套实测实例):
| 项目 | 值 |
|---|---|
| Stoat 版本 | v0.15.5(ghcr.io/stoatchat 服务端) |
| 配置来源 | self-hosted 编排生成 + 后端源码 crates/core/config/Revolt.toml 默认值对照 |
| 入口地址 | http://192.168.1.200:8140(IP:PORT 纯 HTTP 适配形态) |
| 配置文件位置 | 编排目录下 Revolt.toml、secrets.env、livekit.yml、.env.web、.env |
| 验证手段 | GET /api/ 根端点运行时自报 + 注册/登录/发消息实测行为验证 |
二、前置条件
- 已按部署指南完成一套 Stoat 0.15.5 的运行实例(配置文件的结构与生成机制见 《Stoat 0.15.5 Docker Compose 部署指南》第四章)。
- 能编辑编排目录下的配置文件并重启对应服务(
Revolt.toml为 8 个服务共用挂载)。 - 了解 stoat 的两层配置体系:文件层(
Revolt.toml)与环境变量层(secrets.env,运行时同名覆盖)。
三、参数查看与修改方式
Stoat 的配置修改有三种入口,优先级与适用场景不同:
方式一:Revolt.toml 主配置文件(推荐,全部参数)。位于编排目录,挂载进 api、events、autumn、january、gifbox、crond、pushd、voice-ingress 8 个服务。修改后需重启应用服务:
cd /opt/stoat
docker compose restart api events autumn january gifbox crond pushd voice-ingress
实测输出(节选):
Container stoat-api-1 Restarted
Container stoat-events-1 Restarted
Container stoat-autumn-1 Restarted
...
⚠️ 注意:
generate_config.sh重新执行会重写Revolt.toml(旧文件备份为Revolt.toml.old),自定义配置要据此恢复。文件头部注释也明确提示了这一行为。
方式二:secrets.env 环境变量覆盖(密钥专用)。环境变量名与 TOML 配置路径的映射规则是:REVOLT__ 前缀 + 配置段路径以双下划线 __ 连接。实测示例:
| 环境变量 | 覆盖目标 |
|---|---|
REVOLT__PUSHD__VAPID__PRIVATE_KEY | [pushd.vapid] private_key |
REVOLT__FILES__ENCRYPTION_KEY | [files] encryption_key |
REVOLT__API__LIVEKIT__NODES__WORLDWIDE__SECRET | [api.livekit.nodes.worldwide] secret |
改密钥的标准做法是改 secrets.env 后 docker compose up -d(env_file 注入的服务全部重建),而不是直接改 Revolt.toml——这样下次配置脚本重跑时密钥不会丢。
方式三:GET /api/ 根端点只读查看(运行时事实)。该端点无需认证,返回版本号、功能开关状态与当前生效的限额体系,是核对配置是否生效的最快手段:
curl -s http://192.168.1.200:8140/api/ | python3 -m json.tool | head -30
实测输出(节选):
{
"revolt": "0.15.5",
"features": {
"captcha": {
"enabled": false,
"key": ""
},
"email": false,
"invite_only": false,
"autumn": {
"enabled": true,
"url": "http://192.168.1.200:8140/autumn"
},
...
email:false 对应 [api.smtp] host 为空、invite_only:false 对应 [api.registration] invite_only=false、captcha.enabled:false 对应 [api.security.captcha] 未配置——三个开关的状态都能在此直接核对。
四、参数总览
Revolt.toml 的配置段全景(段名 → 用途 → 关键参数数):
| 配置段 | 用途 | 关键参数 |
|---|---|---|
| 顶层 | 运行形态 | production、environment、disable_events_dont_use |
[database] | 数据库连接 | mongodb、redis |
[hosts] | 对外服务地址 | app/api/events/autumn/january 等 7 项 + [hosts.livekit] |
[rabbit] | 消息队列 | 连接 4 项 + 队列名 2 项 |
[api.registration] | 注册策略 | invite_only |
[api.smtp] | 邮件 | 连接 5 项 + 过期策略 3 项 |
[api.security] | 安全 | shield/cloudflare/easypwned/tenor/admin_keys + [api.security.captcha]、[api.security.shield] |
[api.workers] | 代理并发 | max_concurrent_connections |
[api.livekit] | 语音 | call_ring_duration + [api.livekit.nodes] |
[api.audit_logs] | 审计 | expires_after |
[api.users] | 用户名规则 | min_username_length |
[pushd] | 推送通知 | 运行参数 3 项 + 队列名 7 项 + [pushd.vapid]、[pushd.fcm]、[pushd.apn] |
[january] | 链接预览 | blocked_domains |
[files] | 文件存储 | 加密/预览/封锁/杀毒 5 项 + [files.limit]、[files.preview]、[files.s3] |
[features] | 功能开关 | webhooks/提及通知 3 项 + [features.limits](global/new_user/default)+ [features.advanced]、[features.legal_links] |
[sentry] | 错误上报 | 8 个服务各自的 DSN |
💡 说明:这份配置文件沿用
Revolt.toml文件名(项目更名 Stoat 后保留历史名称),TOML 格式,段名[a.b]对应环境变量REVOLT__A__B。[features.limits]的生效值可通过GET /api/直接核对。
五、核心参数分类详解
5.1 连接与基础设施([database] 与 [rabbit])
服务端各组件的内部连接参数,官方编排已对齐,改动通常只发生在「把某个中间件迁到外部」的场景:
[database]
mongodb = "mongodb://database" # MongoDB 连接串,默认指向编排内 database 服务
redis = "redis://redis/" # Redis 连接串,默认指向编排内 redis 服务(Valkey)
[rabbit]
host = "rabbit" # RabbitMQ 主机名
port = 5672 # AMQP 端口
username = "rabbituser" # 默认账号
password = "rabbitpass" # 默认密码
default_exchange = "revolt.default"
[rabbit.queues]
acks = "internal.ack" # 消息已读回执队列
events = "internal.event" # 内部事件队列
逐项解读:mongodb/redis 换外部实例时改连接串即可(如 mongodb://user:pass@10.0.0.5:27017);[rabbit] 的账号密码与 compose.yml 中 rabbit 服务的 RABBITMQ_DEFAULT_USER/PASS 是同一套凭据的两端,改必须两边同步,实测环境沿用默认值验证全链路可用。default_exchange 与队列名不建议动——它们是多服务间事件的寻址约定。
💡 技术拓展:事件分发通道不止 RabbitMQ 一种选择——
通道 原理 适用 RabbitMQ 队列 持久队列,可靠投递 跨服务任务(推送、提及解析) Redis Pub/Sub 内存广播,低延迟 在线事件扇出 直接 WS 广播 服务内直发 单实例小规模 Stoat 实际两者混用:Redis 承担低延迟事件总线(
[database] redis),RabbitMQ 承担可靠任务队列(ack/推送/提及),配置上无需选择,默认即最优。
5.2 对外地址([hosts])
全配置中部署相关性最高的段——客户端直连的服务地址全部来自这里:
[hosts]
app = "http://192.168.1.200:8140" # Web 前端地址
api = "http://192.168.1.200:8140/api" # REST API
events = "ws://192.168.1.200:8140/ws" # WebSocket 实时事件
autumn = "http://192.168.1.200:8140/autumn" # 文件服务
january = "http://192.168.1.200:8140/january" # 链接预览代理
assets = "" # 静态资源 CDN(可选)
voso_legacy = "" # 旧版语音兼容(留空)
voso_legacy_ws = "" # 旧版语音 WS 兼容(留空)
[hosts.livekit]
worldwide = "ws://192.168.1.200:8140/livekit" # 语音 SFU 公网地址
逐项解读:官方默认生成 https://你的域名 形态(generate_config.sh 按 wss://域名/ws 生成 events);本实测环境为 IP:8140 纯 HTTP 适配值。assets 配置后头像等静态资源走 CDN 域名。实测验证:GET /api/ 返回的 autumn.url、january.url、ws、app 字段与本段逐字一致——改完此段后用该端点核对是最快验证法。常见错误是只改 app 不改 autumn,表现为消息可发但头像/附件 404。
5.3 注册与账号安全([api.registration] / [api.smtp] / [api.security] / [api.users])
[api.registration]
invite_only = false # true 时注册必须携带邀请码
[api.smtp]
host = "" # SMTP 主机,空 = 关闭邮件功能
username = ""
password = ""
from_address = "noreply@example.com"
# port = 587 # 可选,默认 587
# use_tls = true # 可选
[api.smtp.expiry]
expire_verification = 604800 # 邮箱验证链接有效期,秒(7 天)
expire_password_reset = 86400 # 密码重置有效期(1 天)
expire_account_deletion = 86400 # 删除确认有效期(1 天)
[api.security]
authifier_shield_key = "" # Shield 反滥用服务密钥
trust_cloudflare = false # true 时信任 Cloudflare 的真实 IP 头
easypwned = "" # 外部泄露密码查询服务地址,空 = 仅用内置黑名单
tenor_key = "" # Tenor GIF API Key(启用 GIF 选择器必填)
admin_keys = [] # 管理 API 密钥列表
[api.security.captcha]
hcaptcha_key = "" # hCaptcha 服务端密钥
hcaptcha_sitekey = "" # hCaptcha 站点密钥
[api.security.shield]
host = "" # Shield 服务地址
key = ""
[api.users]
min_username_length = 2 # 用户名最小长度
逐项解读与实测行为:
[api.smtp] host为空时(实测默认):注册直接成功、无需邮箱验证;但账号找回(密码重置)完全不可用——实测对已注册邮箱重复调用注册接口,服务端转入密码重置分支后因无 SMTP 直接报 500OperationFailed。生产启用 SMTP 后该行为自动修复。[api.security] easypwned:0.15.5 内置约 10 万条泄露密码黑名单(编译进二进制),注册与登录都会校验,实测q1w2e3r4这类口令返回 400CompromisedPassword;配置外部 easypwned 服务地址后优先走外部查询(SHA1 哈希查询,返回secure布尔)。- 用户名规则实测:
admin/revolt/stoat三个保留名(不区分大小写)注册时返回 400InvalidUsername,长度与 Unicode 同形字规范也在该层校验。 tenor_key属第三方 API 密钥,建议通过secrets.env注入:在secrets.env增加REVOLT__API__SECURITY__TENOR_KEY='你的Key',避免明文进Revolt.toml。
5.4 文件与对象存储([files])
上传文件的全链路配置(限额 → 加密 → 预览 → S3 存储):
[files]
encryption_key = "(secrets.env 注入,openssl rand -base64 32 生成)"
webp_quality = 80.0 # WebP 有损预览质量,100 = 无损
blocked_mime_types = [] # 禁止上传的 MIME 类型黑名单
clamd_host = "" # ClamAV 杀毒服务地址(host:port),空 = 不扫描
scan_mime_types = [ # 需要杀毒扫描的类型,空 = 全部扫描
"application/vnd.microsoft.portable-executable",
"application/vnd.android.package-archive",
"application/zip",
]
[files.limit]
min_file_size = 1 # 最小文件字节数
min_resolution = [1, 1] # 最小图片分辨率
max_mega_pixels = 40 # 图片最大 40 MP
max_pixel_side = 10_000 # 图片最长边 10000 px
[files.preview] # 各类附件的预览图最大分辨率
attachments = [1280, 1280]
avatars = [128, 128]
backgrounds = [1280, 720]
icons = [128, 128]
banners = [480, 480]
emojis = [128, 128]
[files.s3]
endpoint = "http://minio:9000" # S3 协议端点
path_style_buckets = false # MinIO 用虚拟主机风格
region = "minio"
access_key_id = "minioautumn" # 与 minio 服务 MINIO_ROOT_USER 一致
secret_access_key = "minioautumn" # 与 MINIO_ROOT_PASSWORD 一致
default_bucket = "revolt-uploads" # 默认桶名(createbuckets 任务创建)
逐项解读:encryption_key 是存量文件可读性的唯一凭据,服务端用它对写入 S3 的内容做加密(实测:明文文本上传后 MinIO 桶内对象为加密形态,下载时服务端解密还原);[files.s3] 官方注释给出换 Backblaze B2 的完整参数示例(path_style_buckets = true + B2 的 endpoint/keyID/token);换外部对象存储时同步改 endpoint 与凭据即可,桶名保持 revolt-uploads 或同步改 compose 里 createbuckets 任务的 mc mb 行。
各类附件的上传大小限额在 [features.limits.*.file_upload_size_limit](见 5.7),此处不重复。实测上传验证:18 字节文本经 autumn 上传返回 {"id":"hKJF9aL6PWdQByFT_miNdLqdqnAQizvdj7nN-l2jpC"},挂到消息后经 /autumn/attachments/<id>/文件名 下载还原内容一致。
⚠️ 注意:实测发现一个设计行为——上传后未挂到消息/头像等用途(
used_for为空)的文件,直接访问下载 URL 返回 404NotFound;先以附件形式发送消息后才可公开访问。做自动化上传时必须完成"挂载"步骤。
5.5 语音视频([api.livekit] 与 livekit.yml)
Revolt.toml 侧只有节点与呼叫参数:
[api.livekit]
call_ring_duration = 30 # DM/群语音呼叫响铃时长(秒)
[api.livekit.nodes.worldwide]
url = "http://livekit:7880" # 节点内网地址(服务端信令用)
lat = 0.0
lon = 0.0
语音真正的运行配置在 livekit.yml(挂载进 LiveKit 服务):
rtc:
use_external_ip: true
port_range_start: 50000
port_range_end: 50100
tcp_port: 7881
redis:
address: redis:6379
turn:
enabled: false
keys:
5782a5da1864: (secrets.env 中的 LiveKit secret)
webhook:
api_key: 5782a5da1864
urls:
- "http://voice-ingress:8500/worldwide"
逐项解读:rtc 段决定 RTC 端口(TCP 7881 + UDP 50000-50100,需公网直放);turn.enabled 开启后可给 NAT 后客户端提供中继(默认关闭,因 TURN 需要额外端口与凭据);keys 段的键值对必须与 secrets.env 的 REVOLT__API__LIVEKIT__NODES__WORLDWIDE__KEY/SECRET 一致(generate_config.sh 生成时自动对齐,手工改要两处同步)。[features.limits.*.video_resolution] 控制视频分辨率上限,默认 720p,启用摄像头共享时 generate_config.sh 会改写为 1080p。
5.6 推送通知([pushd])
pushd 守护进程的三通道推送配置:
[pushd]
production = true # 队列名前缀隔离(避免同实例多环境串扰)
mass_mention_chunk_size = 200 # 全员/角色提及解析的分块大小
render_cache_time = 60 # 通知内容名称解析缓存(秒)
[pushd.vapid]
queue = "notifications.outbound.vapid"
private_key = "(secrets.env 注入)"
public_key = "(secrets.env 注入)"
[pushd.fcm]
queue = "notifications.outbound.fcm"
key_type = "" # Google FCM 服务账号凭据,全部留空 = 关闭
project_id = ""
private_key = ""
...
[pushd.apn]
sandbox = false
queue = "notifications.outbound.apn"
pkcs8 = "" # Apple APN 凭据,留空 = 关闭
key_id = ""
team_id = ""
topic = "chat.revolt.app" # iOS Bundle ID
逐项解读:自托管默认只启用 VAPID(Web Push)——secrets.env 中的 VAPID 密钥对由 generate_config.sh 自动生成(EC P-256 私钥 + DER 公钥),浏览器授权通知后即可收到推送;FCM(安卓)与 APN(iOS)需要官方开发者账号凭据,自托管通常保持关闭。mass_mentions_chunk_size 增大可加快大服务器全员提及解析但更吃内存。实测验证:GET /api/ 返回的 vapid 字段即 [pushd.vapid] public_key 的运行时值。
5.7 功能开关与限额([features])
[features]
webhooks_enabled = false # 消息 Webhook 总开关(默认关)
mass_mentions_send_notifications = true # 全员@是否发推送
mass_mentions_enabled = true # 是否允许全员/角色@
[features.limits.global] # 全局硬上限
group_size = 100 # 群组成员上限
message_embeds = 5 # 单条消息嵌入数
message_replies = 5 # 单条消息回复引用数
message_reactions = 20 # 单条消息表情回应数
server_emoji = 100 # 单服务器表情上限
server_roles = 200 # 单服务器角色上限
server_channels = 200 # 单服务器频道上限
new_user_hours = 72 # "新用户"判定时长(小时)
body_limit_size = 20_000_000 # 请求体上限 20MB
restrict_server_creation = [] # 限制建服的用户 ID 白名单,空 = 不限
max_invite_duration_days = 30 # 邀请最长有效期
[features.limits.new_user] # 新用户(注册 72 小时内)限额
outgoing_friend_requests = 5
bots = 2
message_length = 2000
message_attachments = 5
servers = 50
voice_quality = 16000
video = true
video_resolution = [1080, 720]
video_aspect_ratio = [0.3, 2.5]
[features.limits.new_user.file_upload_size_limit]
attachments = 20_000_000 # 附件 20MB
avatars = 4_000_000 # 头像 4MB
backgrounds = 6_000_000 # 背景 6MB
icons = 2_500_000 # 图标 2.5MB
banners = 6_000_000 # 横幅 6MB
emojis = 500_000 # 表情 500KB
[features.limits.default] # 老用户默认限额(结构同上)
outgoing_friend_requests = 10
bots = 5
message_length = 2000
message_attachments = 5
servers = 100
...
[features.advanced]
process_message_delay_limit = 5 # 提及解析任务的延迟容忍(消息数)
seen_events_cache_size = 2048 # 事件去重缓存(每个 WS 连接,大=省流量耗内存)
[features.legal_links]
terms_of_service = "" # 服务条款 URL(留空则客户端不显示)
privacy_policy = ""
guidelines = ""
逐项解读与实测对照:这一段是运行时最能直接核对的——GET /api/ 返回的 limits.global、limits.new_user、limits.default 与上述默认值逐字一致(实测回显含 server_channels:200、message_length:2000、file_upload_size_limits.emojis:500000 等)。改此段后无需猜测是否生效,刷新该端点即可。restrict_server_creation 填入用户 ID 数组后只有白名单用户能建服务器(公开实例防灌水的第一道闸);webhooks_enabled 打开后才有消息 Webhook 能力。
5.8 可观测与其他([sentry] / [january] / [api.audit_logs] / [api.workers])
[sentry]
api = "" # 各服务独立的 Sentry DSN,留空 = 上报关闭
events = ""
voice_ingress = ""
files = ""
proxy = ""
pushd = ""
crond = ""
gifbox = ""
[january]
blocked_domains = [] # 链接预览域名黑名单
[api.audit_logs]
expires_after = 2592000 # 审计日志保留 30 天(秒)
[api.workers]
max_concurrent_connections = 50 # january 抓取并发上限
逐项解读:自托管 Sentry 通常留空;january 是外链预览抓取服务,公开实例建议把恶意站点加入 blocked_domains;expires_after 按秒计(2592000 = 30 天),审计合规有更长要求时调大。
5.9 顶层与前端环境变量
Revolt.toml 顶层三项:
production = false # 是否生产模式
disable_events_dont_use = false # 紧急停用事件服务的开关(名字即警告:不要用)
environment = "dev" # 运行环境标识
.env.web 前端构建变量(见部署篇第六章全表):HOSTNAME 决定 web 服务监听地址,VITE_API_URL 等决定前端调后端的基准地址,改动后需重建 web 服务。
六、生产配置模板
适用场景:100-500 人社区、2C4G 起、有域名与 HTTPS、启用邮件找回、GIF 选择器、开放注册。以下只列需要偏离默认值的项(其余保持 generate_config.sh 生成值),可直接追加/替换到 Revolt.toml:
# ---- 对外地址(域名 + HTTPS/WSS 标准形态)----
[hosts]
app = "https://chat.example.com"
api = "https://chat.example.com/api"
events = "wss://chat.example.com/ws"
autumn = "https://chat.example.com/autumn"
january = "https://chat.example.com/january"
gifbox = "https://chat.example.com/gifbox"
[hosts.livekit]
worldwide = "wss://chat.example.com/livekit"
# ---- 邮件(启用验证与找回)----
[api.smtp]
host = "smtp.example.com"
username = "noreply@example.com"
password = "${SMTP_PASSWORD}"
from_address = "noreply@example.com"
port = 587
use_tls = true
# ---- 安全 ----
[api.security]
easypwned = "" # 有内部泄露库服务时填地址,否则用内置黑名单
tenor_key = "${TENOR_API_KEY}" # GIF 选择器必填
trust_cloudflare = true # 前置 Cloudflare 时开启
[api.security.captcha]
hcaptcha_key = "${HCAPTCHA_KEY}" # 防机器人注册
hcaptcha_sitekey = "${HCAPTCHA_SITEKEY}"
# ---- 文件 ----
[files]
blocked_mime_types = ["application/vnd.microsoft.portable-executable", "application/vnd.android.package-archive"]
# ---- 限额收紧(公开实例防滥用)----
[features.limits.global]
restrict_server_creation = [] # 如需收紧填管理员用户 ID 数组
[features.limits.new_user]
servers = 10 # 新用户建服/加服上限收紧
message_length = 2000
[features.limits.new_user.file_upload_size_limit]
attachments = 8_000_000 # 新用户附件降到 8MB
# ---- 运营 ----
[features.legal_links]
terms_of_service = "https://example.com/tos"
privacy_policy = "https://example.com/privacy"
模板说明:${SMTP_PASSWORD} 等 4 个第三方凭据走 secrets.env 注入(在该文件加 REVOLT__API__SMTP__PASSWORD='...'、REVOLT__API__SECURITY__TENOR_KEY='...'、REVOLT__API__SECURITY__CAPTCHA__HCAPTCHA_KEY='...'、REVOLT__API__SECURITY__CAPTCHA__HCAPTCHA_SITEKEY='...',格式见第三章映射规则),避免明文落在版本库里的 Revolt.toml。启用摄像头/屏幕共享无需改文件——generate_config.sh 交互选择即可。改完执行:
cd /opt/stoat && docker compose restart api events autumn january gifbox crond pushd voice-ingress
验证生效:
curl -s https://chat.example.com/api/ | python3 -m json.tool | grep -E '"email"|"invite_only"|"enabled"'
预期 email:true(SMTP 已配置)、captcha.enabled:true。
七、常见问题
Q1:改了 Revolt.toml 没生效?
三个可能:只重启了部分服务(Revolt.toml 挂载进 8 个服务,按第三章命令全量重启);改错文件(secrets.env 的环境变量在运行时覆盖同名配置,优先检查 env_file 是否有同名键);generate_config.sh 重跑覆盖了自定义项(从 Revolt.toml.old 找回)。
Q2:secrets.env 丢了怎么办?
VAPID 密钥丢了可重新生成(影响浏览器推送订阅,用户重新授权即可);文件加密密钥(REVOLT__FILES__ENCRYPTION_KEY)丢了无法恢复,MinIO 里所有存量文件永久不可读。这就是部署篇反复强调备份密钥的原因。
Q3:注册/登录报 CompromisedPassword,如何彻底关闭校验?
无法完全关闭——内置泄露密码黑名单编译在二进制内,无开关。可行的缓解:配置外部 easypwned 服务走自定义判定;或在自有网络策略上接受该行为(其本质是安全特性)。实测确认校验同时作用于注册(create_account)与登录(session/login)两个入口。
Q4:invite_only 开了之后邀请码从哪来?
官方 README 的 Guides 说明:在 MongoDB 的邀请集合中手工插入邀请码记录(编排形态下进 database 服务操作),注册时在表单/API 携带 invite 字段核销。适合"半公开"社区。
Q5:上传文件返回成功但访问 404?
见 5.4 的实测说明:used_for 为空的文件拒绝下载。把返回的文件 id 作为消息附件发送(attachments: [id])后再访问即可。这是防外链盗用的设计行为,不是故障。
Q6:如何核对当前所有限额的实际生效值?
curl -s http://你的入口/api/ 的 limits 对象即运行时事实(global/new_user/default 三层结构完整自报),与 [features.limits] 配置段一一对应,无需重启查看。
八、参考链接
- 后端配置模型源码:https://github.com/stoatchat/stoatchat(crates/core/config/Revolt.toml,本文默认值对照来源)
- 官方自托管编排仓库:https://github.com/stoatchat/self-hosted(generate_config.sh 生成逻辑、Guides.md 场景指南)
- TOML 格式规范:https://toml.io
- LiveKit 服务端配置:https://docs.livekit.io/home/self-hosting/vm/
- 部署实操:《Stoat 0.15.5 Docker Compose 部署指南》(配置文件生成与挂载机制、密钥备份)
- API 调用参考:《Stoat 0.15.5 API 使用详解》(限额/开关配置的运行时核对端点与实测回显)
- 认知与选型:《Stoat 0.15.5 介绍与选型指南》(架构与服务拆分背景)
- 同类组件配置参照:《SAMA 0.37 介绍与选型指南》、《Mastodon 4.7.3 介绍与选型指南》(同为多服务自托管栈,环境变量/env 文件的配置组织方式可与本文对照)