Databunker 0.8.37 配置参数详解
Databunker 0.8.37 配置体系全解:命令行参数、主密钥与数据库环境变量、databunker.yaml 十段逐键详解,含 YAML 优先于环境变量的加载顺序实测与三个排障实录。
Databunker 0.8.37 配置参数详解
Databunker 的配置由三层构成:命令行参数(启动/初始化动作)、环境变量(密钥与数据库连接、部分 YAML 覆盖)、YAML 配置文件(服务行为)。本文逐段拆解 0.8.37 的配置面,关键开关全部实测验证——包括一个容易踩坑的加载顺序:YAML 文件优先于环境变量。适合已完成部署(见《Databunker 0.8.37 Docker Compose 部署指南》)、需要按合规要求调参的运维与后端工程师。
一、配置体系总览
服务进程启动时的处理顺序(源码 src/service.go loadService(),0.8.37):
ReadEnv(&cfg) // ① envconfig 先用环境变量填充配置结构
ReadConfFile(&cfg, confPtr) // ② 再解析 YAML——同名键会覆盖①的结果
由此得出两条实际规则:
- YAML 里显式写出的键,环境变量覆盖不了。官方默认
databunker.yaml显式设置了server.port: 3000,实测注入BUNKER_PORT=3001后监听端口仍是 3000:
docker compose exec -T -e BUNKER_PORT=3001 databunker sh -c \
'/bin/busybox timeout 3 /databunker/bin/databunker -start -db databunkerdb -conf /databunker/conf/databunker.yaml 2>&1'
2026/11/03 03:49:00 Databunker version: 0.8.37-20261030100830-7667c5056897
2026/11/03 03:49:00 Loading configuration file: /databunker/conf/databunker.yaml
2026/11/03 03:49:00 Open HTTP listener 0.0.0.0:3000
2026/11/03 03:49:00 ListenAndServe(): listen tcp 0.0.0.0:3000: bind: address already in use
(末行 bind: address already in use 是因为常驻实例正占用 3000,属预期;关键是第二行证明端口取的是 YAML 值。)
- YAML 中未写(或被注释)的键,环境变量才生效。例如
generic.admin_email在默认 YAML 中不存在,ADMIN_EMAIL环境变量可直接注入。
因此调参的正确姿势是:改 databunker.yaml(挂载替换)为主,环境变量仅用于密钥、数据库连接和 YAML 未占位的字段。
二、命令行参数
二进制 /databunker/bin/databunker 无子命令体系,仅 8 个 flag(flag 定义见源码,全部实测):
| 参数 | 作用 | 说明 |
|---|---|---|
-init | 建表、生成主密钥与根令牌 | 幂等:库已存在时输出 Database is alredy initialized.(原文含官方拼写笔误)后退出 |
-demoinit | 同上,但根令牌固定为 DEMO | 官方 demo 形态用,勿入生产 |
-start | 启动 API 服务 | 缺它直接退出并提示 'databunker -start' command is missing. |
-db | 数据库名/文件 | 默认 databunker;PostgreSQL/MySQL 下为库名(官方建 databunkerdb),SQLite 下为数据文件 |
-conf | YAML 路径 | 不传则按 databunker.yaml 在进程工作目录查找;官方部署传 /databunker/conf/databunker.yaml |
-masterkey | 传入主密钥 | 优先级最高(见第四节) |
-roottoken | 初始化时指定根令牌 | 必须 UUID 格式 |
-version | 打印版本串 | 实测输出:Databunker version: 0.8.37-20261030100830-7667c5056897 |
-start 的健壮行为(源码 + 实测):
- 数据库尚未就绪时每秒重试、最多 60 次(
Trying to open db [1]…),适配 PostgreSQL 冷启动;实测把PGSQL_HOST置空触发 SQLite 回落时同样进入该循环:
docker compose exec -T -e PGSQL_HOST= databunker sh -c \
'/bin/busybox timeout 3 /databunker/bin/databunker -start -db databunkerdb -conf /databunker/conf/databunker.yaml 2>&1'
2026/11/03 03:49:53 Databunker version: 0.8.37-20261030100830-7667c5056897
2026/11/03 03:49:53 Loading configuration file: /databunker/conf/databunker.yaml
2026/11/03 03:49:54 Trying to open db [1]
2026/11/03 03:49:55 Trying to open db [2]
- 60 次后仍无库:输出
Database is not initialized并提示先跑-init,进程退出。
三、运行时环境变量(密钥与数据库)
这组变量不走 YAML,由 os.Getenv 直接读取,是部署编排的必配项:
| 变量 | 说明 |
|---|---|
DATABUNKER_MASTERKEY | 主密钥,48 个 hex 字符(解码为 24 字节)。缺失时 -start 直接退出并提示三种提供方式 |
DATABUNKER_MASTERKEY_FILE | 主密钥文件路径变体(适合 secrets 挂载) |
DATABUNKER_ROOTTOKEN | 根令牌(UUID),-init 时写入;日常 API 认证头 X-Bunker-Token 用它 |
DATABUNKER_ROOTTOKEN_FILE | 根令牌文件路径变体 |
PGSQL_HOST | 设置即启用 PostgreSQL 后端(官方生产形态) |
PGSQL_PORT | 默认 5432 |
PGSQL_USER_NAME / PGSQL_USER_PASS / PGSQL_USER_PASS_FILE | 数据库账号 |
MYSQL_HOST / MYSQL_PORT / MYSQL_USER_NAME / MYSQL_USER_PASS / MYSQL_USER_PASS_FILE | MySQL 后端等价变量 |
后端选择逻辑(src/storage.go initStorage()):MYSQL_HOST 非空 → MySQL;否则 PGSQL_HOST 非空 → PostgreSQL;否则 SQLite(数据文件落在 -db 指定的文件名)。实测清空 PGSQL_HOST 后进程即按 SQLite 路径找库文件(上节回显)。
主密钥校验(实测两类失败回显):
docker compose exec -T databunker sh -c 'DATABUNKER_MASTERKEY=tooshort /databunker/bin/databunker -start -db databunkerdb'
2026/11/03 03:47:01 Databunker version: 0.8.37-20261030100830-7667c5056897
2026/11/03 03:47:01 Loading configuration file: databunker.yaml
2026/11/03 03:47:01 Error: Master key length is wrong
docker compose exec -T databunker sh -c 'DATABUNKER_MASTERKEY=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz /databunker/bin/databunker -start -db databunkerdb'
2026/11/03 03:47:01 Error: Failed to decode master key
长度不足 48 与非法 hex 都会在启动期快速失败——不会带着坏密钥提供服务,也不会静默生成新密钥。
四、密钥优先级与派生链
主密钥/根令牌的取值优先级由 utils.GetArgEnvFileVariable 决定:
命令行参数(-masterkey / -roottoken) > 环境变量 > *_FILE 文件
拿到主密钥后的内部派生(源码级):
- 记录加密:AES-256-GCM,密钥 = 主密钥(24B) + 每条记录随机密钥(8B);
- 检索索引盐值与验证码密钥:
md5(masterKey)——loginidx/emailidx/phoneidx列即base64(SHA-256(salt + 归一化值)),登录验证码串用该派生密钥 AES-GCM 加密; - 0.8.37 起
-init日志中密钥一律打码(Master key: ****),密钥管理必须依赖env_file/文件挂载,不能靠抄日志(见《Databunker 0.8.37 Docker Compose 部署指南》第七节)。
⚠️ 换主密钥 = 旧数据永久不可解。
DATABUNKER_MASTERKEY变更不会触发任何迁移提示,解密直接失败。备份该值是运维第一优先级。
五、YAML 配置文件逐段详解
官方默认 databunker.yaml(3241 字节,挂载于 /databunker/conf/databunker.yaml)全文分 10 段。以下按段说明,标注默认值与实测行为。
5.1 generic —— 全局 API 行为
generic:
create_user_without_access_token: true
# use_separate_app_tables: true
# list_users: true
# disable_audit: true
| 键 | 默认 | 实测行为 |
|---|---|---|
create_user_without_access_token | true(官方默认值) | 不带 X-Bunker-Token 的 POST /v1/user 也允许创建(返回新 token)。面向公众注册场景需要它;纯内部系统建议改 false 收紧 |
use_separate_app_tables | false | true 时 userapps 数据按应用分表存储 |
list_users | false | false:POST /v1/users 返回 Access denied(实测 403);true:返回全量用户列表,且 private 字段为 base64 编码明文(base64 只是编码)——开启前想清楚你是否真的要这条导出通道 |
disable_audit | false | 实测开启后新操作不再写入 audit 表(/v1/audit/admin 的 total 保持不变)。GDPR 审计留痕依赖此功能,关闭需合规评估 |
admin_email | 空 | 管理员邮箱(通知用),可被 ADMIN_EMAIL 环境变量注入(YAML 默认未写该键) |
5.2 selfservice —— 用户自助权限
selfservice:
#forget_me: false
#user_record_change: true
app_record_change: ["*"]
| 键 | 默认 | 实测行为 |
|---|---|---|
forget_me | false | 实测置 true 后,用户凭登录换取的 xtoken 即可 DELETE /v1/user/email/<自己> 完成自助删除,返回 {"status":"ok","result":"done"};随后读该记录 data 为空对象(加密擦除)。false 时该操作需 Admin/DPO 令牌 |
user_record_change | false | true 允许用户不经审批修改主记录 |
app_record_change | ["*"](官方默认值) | 用户可自助修改的应用数据域白名单,* 为全部 |
5.3 notification —— 事件外推
notification:
#notification_url: "https://httpbin.org/post"
notification_url 接收 JSON 事件:登录失败、forget me、资料变更、同意变更。合规告警接入点。另有 magic_sync_url/magic_sync_token(跨实例同步,Pro 场景)。
5.4 policy —— 数据保留期
policy:
max_user_retention_period: "3m"
max_audit_retention_period: "6m"
max_session_retention_period: "1h"
max_shareable_record_retention_period: "1m"
后台清理任务每 10 分钟跑一次(源码 dbCleanup ticker)。单位语义:h 小时、d 天、m 月、y 年。源码默认值分别为 1m/12m/1h/1m,官方 YAML 把用户保留期收紧到 3m、审计 6m。到期记录由清理任务删除——这是 GDPR "存储限制原则"的落地开关。
5.5 ssl —— TLS 监听
ssl:
ssl_certificate: "/databunker/certs/server.cer"
ssl_certificate_key: "/databunker/certs/server.key"
存在即启用:服务启动时 os.Stat 检查证书路径(源码 service.go:132),文件存在则 Open HTTPS listener,否则 Open HTTP listener——没有单独的 enable 开关。TLS 最低版本 1.2,套件白名单硬编码(TLS1.3 AES-GCM/CHACHA20 + ECDHE-RSA AES-GCM 等)。环境变量 SSL_CERTIFICATE/SSL_CERTIFICATE_KEY 因 YAML 显式赋值而无效(见第一节规则),改路径请直接改 YAML 或挂载到固定路径。私钥权限坑与实测过程见《Databunker 0.8.37 Docker Compose 部署指南》第九节。
5.6 sms —— 短信网关
模板化配置:url 支持 {token}/{from}/{phone}/{msg} 占位符;method GET/POST;POST 体经 body 模板(_TOKEN_/_FROM_/_PHONE_/_MSG_ 修饰符);支持 basic_auth、custom_header、content_type。default_country: "GB" 用于电话号归一化(libphonenumber 国家码)。不配置则登录短信链路不可用(邮件走 smtp 段)。
5.7 server —— 监听地址
server:
host: "0.0.0.0"
port: 3000
对应 BUNKER_HOST/BUNKER_PORT 环境变量名,但官方 YAML 显式赋值使其覆盖失效(实测见第一节);要改端口请编辑 YAML 本身。
5.8 smtp —— 邮件网关
server/port/user/pass/sender 五键,占位符默认值(email-smtp-server.com 等)需替换。登录验证码邮件依赖此段;环境变量 SMTP_SERVER/SMTP_PORT/SMTP_USER/SMTP_PASS/SMTP_SENDER 同样因 YAML 显式赋值而无效,直接改 YAML。
5.9 ui —— Web 门户品牌化
logo_link、company_title、company_link、term_of_service_title/link、privacy_policy_title/link、custom_css_link、magic_lookup 等,控制内置自助门户的抬头、条款链接与样式。纯展示项,改完刷新页面即生效(进程无需重启的静态资源,但 YAML 加载在启动期,改配置仍需重启)。
5.10 结构体中存在、默认 YAML 未写的键
源码 Config 结构还接受:generic.user_record_schema(记录字段校验 schema 文件)、selfservice 之外的 policy 扩展字段、ui.company_vat/city/country/address 等。YAML 解析为宽松模式,未知键忽略——升级版本时旧 YAML 直接兼容。
六、配置变更与生效方式
| 改了什么 | 生效命令 | 注意 |
|---|---|---|
databunker.yaml 内容 | docker compose restart databunker | 只读挂载的文件内容改动 restart 即生效 |
docker-compose.yml 的 env_file 内容 | docker compose up -d(重建) | restart 不会重新读取 env_file 变化以外的定义 |
docker-compose.yml 的 volumes 定义 | docker compose up -d(重建) | restart 不更新挂载——实测删掉证书挂载后服务仍走 HTTPS,直到 up -d --force-recreate 才回落 HTTP(排障实录 2) |
| 主密钥/根令牌 | 禁止轮换 | 换 masterkey 旧数据永久不可解 |
七、排障实录
实录 1:BUNKER_PORT 环境变量不生效
见第一节实测。根因是 loadService() 先 ReadEnv 后 ReadConfFile,YAML 显式键覆盖环境变量。解法:改 YAML 的 server.port,而不是注入环境变量。
实录 2:restart 后 HTTPS 状态残留
- 现象:从 compose 中删除
certs挂载并执行docker compose restart databunker后,服务仍是Open HTTPS listener,HTTP 请求收到Client sent an HTTP request to an HTTPS server.。 - 根因:restart 只重启进程,不重建挂载;旧证书文件仍在服务视图内,"存在即启用"逻辑继续走 TLS。
- 解法:
docker compose up -d --force-recreate databunker。实测重建后恢复Open HTTP listener 0.0.0.0:3000,curl http://localhost:8134/v1/status返回OK。
实录 3:主密钥格式错误快速失败
Error: Master key length is wrong(长度≠48)与 Error: Failed to decode master key(非 hex)——均发生在启动期且进程直接退出,服务不会带病运行。检查 generate-pgsql-env-files.sh 生成值是否被截断/混入换行。
八、常见问题
Q1:想禁用匿名创建用户改哪里? generic.create_user_without_access_token: false。官方默认值是 true(面向注册场景),内部系统建议关闭。
Q2:POST /v1/users 返回 Access denied 是坏了吗? 不是,是安全默认值。list_users 默认 false;开启后返回的 private 字段是 base64 明文编码(实测),请仅作为受控导出通道使用。
Q3:审计表会无限膨胀吗? 有 policy.max_audit_retention_period(官方 YAML 默认 6 个月)+ 每 10 分钟清理任务兜底;也可 disable_audit: true 整体关闭(合规场景慎用)。
Q4:能否只改环境变量不动 YAML? 密钥与数据库连接类(第三节的 DATABUNKER_*/PGSQL_*/MYSQL_*)可以且必须这样;行为类开关受第一节优先级规则限制,多数只能改 YAML。
Q5:配置里设了弱主密钥会被拒吗? 只校验格式(48 hex),不校验熵。请用官方脚本或 /dev/urandom 生成,勿手编。