如何用 config.toml 配置 SpacetimeDB Standalone 的日志级别、提交日志与 JWT 签名密钥
【免费下载链接】SpacetimeDBDevelopment at the speed of light项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB
用spacetime start启动的本地 Standalone 数据库实例,其运行行为可以通过数据库数据目录下的config.toml来调整。这篇文章解决一个具体任务:在已安装 SpacetimeDB CLI 的环境中,通过修改config.toml设置三组配置——日志级别([logs])、本地持久化的提交日志行为([commitlog])、以及数据库签发身份令牌所用的 JWT 签名密钥([certificate-authority])——然后重启实例并验证配置生效。适用对象是运行 Standalone 版本做本地开发或自托管的开发者;前提是已安装spacetimeCLI 并能执行spacetime start。
配置参考文档是 Standalone Configuration,密钥生成与轮换流程可参考 Azure Self-Hosted VMs + Key Rotation。
先找到 config.toml 的位置
配置文件位于{data-dir}/config.toml,{data-dir}是数据库的数据目录。运行spacetime start时,启动输出会直接打印这个目录,文档示例(示例结果):
spacetimedb-standalone version: 1.0.0 spacetimedb-standalone path: /home/user/.local/share/spacetime/bin/1.0.0/spacetimedb-standalone database running in data directory /home/user/.local/share/spacetime/data各平台的数据目录默认位置:
- Linux / macOS:
~/.local/share/spacetime/data - Windows:
%LOCALAPPDATA%\SpacetimeDB\data
修改配置后需要重启spacetime start进程才能生效,Standalone 模式默认在前台运行。如果数据目录中还没有config.toml,首次启动会写入一份内置的默认模板,即仓库中的 crates/standalone/config.toml,可以打开它对照各节注释进行修改。
配置日志级别:[logs]
[logs]表控制服务器日志的输出量,文档给出的完整示例:
[logs] level = "error" directives = [ "spacetimedb=warn", "spacetimedb_standalone=info", ]level可取"error"、"warn"、"info"、"debug"、"trace"、"off",不区分大小写。语义是“只输出该级别及以上的消息”,例如设为warn时只会记录error和warn级别的日志。directives是一组过滤指令,可以覆盖全局level,按 tracing-subscriber 的 EnvFilter directives 语法书写,用目标=级别的格式按模块单独控制日志量,例如上面的配置中spacetimedb模块按warn过滤、spacetimedb_standalone模块按info过滤。
需要留意文档中的原话限制:directives主要设计为调试工具,日志消息的字段和 target不视为稳定接口,升级后可能需要重新核对指令内容。
配置提交日志:[commitlog]
[commitlog]表配置本地持久化(local durability)。文档明确说明这些设置属于进阶项,可能影响恢复行为、磁盘占用、内存占用和写吞吐;省略的字段会使用服务器内置默认值,所以只调整你关心的字段即可。示例(数值取自文档):
[commitlog] log-format-version = 1 max-segment-size = 1073741824 # 1GiB offset-index-interval-bytes = 4096 offset-index-require-segment-fsync = true preallocate-segments = false write-buffer-size = 131072 # 128KiB各字段含义以文档为准:
| 字段 | 含义与限制 |
|---|---|
log-format-version | 支持的最大 commitlog 格式版本,写入时也使用它。文档特别提示:正常情况下不应改动该值;改动的理由是让服务器接受一份更旧的、不兼容的 commitlog。 |
max-segment-size | commitlog 分段允许增长到的最大字节数。 |
offset-index-interval-bytes | 每写入多少字节后,向 offset index 追加一条索引条目。 |
offset-index-require-segment-fsync | true时,要求分段先同步到磁盘后才追加索引条目;false时即使 commitlog 未同步也会按offset-index-interval-bytes更新索引,意味着崩溃后索引中可能包含并不存在的条目。两种取值下 commitlog 都能正确工作,但选择会影响性能。 |
preallocate-segments | true时为分段预分配磁盘空间直至max-segment-size;仅在 commitlog 的 fallocate 支持启用时有效。 |
write-buffer-size | 提交数据刷入存储前的内存缓冲区字节数。 |
配置 JWT 签名密钥:[certificate-authority]
[certificate-authority]表配置数据库用于签发身份令牌的一对公钥/私钥:
[certificate-authority] jwt-priv-key-path = "/path/to/id_ecdsa" jwt-pub-key-path = "/path/to/id_ecdsa.pub"上面的路径是占位写法,需替换为你实际存放密钥的文件绝对路径。crates/standalone/config.toml 中同样给出了注释形式的示例,使用~/.config/spacetime/id_ecdsa(私钥)与~/.config/spacetime/id_ecdsa.pub(公钥),取消注释并改成你的路径即可。
生成兼容密钥对的规范命令在 Key Rotation 指南 中:SpacetimeDB 用 EC 密钥对(ES256,P-256)给本地身份令牌签名,用 OpenSSL 生成:
mkdir -p ./.generated/spacetimedb-keys openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out ./.generated/spacetimedb-keys/id_ecdsa openssl pkey -in ./.generated/spacetimedb-keys/id_ecdsa -pubout -out ./.generated/spacetimedb-keys/id_ecdsa.pub chmod 600 ./.generated/spacetimedb-keys/id_ecdsa chmod 644 ./.generated/spacetimedb-keys/id_ecdsa.pub生成后把config.toml中的两个路径指向这两个文件。关于密钥加载,文档给出的硬性约束:
- 密钥在服务器启动时加载,没有热重载;更换密钥后必须重启
spacetime start进程。 - 本地签发的令牌只用一个当前生效的公钥来验证;轮换密钥会使旧私钥签发的令牌失效。
- 密钥路径也可以不走
config.toml,而是用--jwt-priv-key-path/--jwt-pub-key-path启动参数传入;config.toml与启动参数是同一份配置的两种来源。若两者都没提供,启动会失败并提示缺少--jwt-{pub,priv}-key-path。
验证配置是否生效
按下面的顺序核对,每一步都对应文档中明确描述的行为:
确认配置的是对的文件:重新运行
spacetime start,观察启动输出中database running in data directory ...一行打印的目录,确认你编辑的正是该目录下的config.toml。日志级别:观察前台输出(Standalone 模式在前台运行)。按
level的语义,设为error后应只剩error及以上日志;如果你用directives单独放开了某个模块(如spacetimedb=debug),该模块的debug日志应恢复出现。JWT 密钥:重启后对数据库执行一次
spacetime publish,再检查日志中指南给出的标记关键字:docker compose -f ./.generated/docker-compose.yaml logs --no-color --tail=200 spacetimedb | rg "PUBLISH_SUCCESS|PUBLISH_FAILED|InvalidSignature|not authorized"该命令来自 Docker 自托管场景;非容器部署下用
spacetime start的前台输出或你的日志查看方式,对照相同的关键字判断:出现PUBLISH_SUCCESS表示发布链路正常;InvalidSignature或not authorized对应令牌签名无效或身份不属于数据库所有者这两种失败模式。注意这条日志过滤命令里的 compose 文件路径属于该指南示例的目录约定,非容器部署不要照抄。
限制与常见坑
log-format-version不要随手改:文档将其标注为 cautions 级别的设置,正常场景保持默认;只有要接受旧的、不兼容的 commitlog 时才需要动它。offset-index-require-segment-fsync的取舍:设为false换写性能,代价是崩溃后 offset index 可能包含不存在的条目;设为true时索引条目可能比严格的间隔更少。两者下 commitlog 行为都正确,属性能与恢复行为的权衡。preallocate-segments依赖 fallocate 支持:在未启用 fallocate 的环境里该设置没有效果,文档没有说明启用条件,若不确定就先保持默认。- 改配置必须重启:日志、commitlog、密钥都不支持热更新;同一份指南里的
module-http.enabled等设置同样要求重启服务器。 directives不稳定:日志字段与 target 不承诺兼容,版本升级后建议重新核对指令是否仍然命中目标模块。
下一步
如果需要系统化的自托管部署(Docker 部署、密钥轮换、发布验证的完整脚本),继续看 Key Rotation 指南 中的 Mode A / Mode B 两种部署模式;只想跑通本地开发流程的话,从 Getting Started 的spacetime start出发,再按需回来调整本文的三组配置。
【免费下载链接】SpacetimeDBDevelopment at the speed of light项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考