DittoFS 配置参数详解
DittoFS v0.34.1 配置参数详解,覆盖 config.yaml 全部配置键、DITTOFS_ 环境变量覆盖、两层配置模型、SQLite/PostgreSQL 控制面、JWT、TLS 与安全默认值,均基于实测回显整理。
DittoFS 配置参数详解
目标:完整梳理 DittoFS v0.34.1 的配置体系——config.yaml 全部配置键、
DITTOFS_环境变量覆盖、两层配置模型(进程级配置 + 控制面数据库)、SQLite/PostgreSQL 控制面、JWT、TLS 与安全默认值。全部参数基于dfs init生成的真实配置与实测回显整理。
DittoFS 的配置系统非常灵活:支持 YAML/TOML 配置文件与 DITTOFS_ 前缀环境变量覆盖,并把「进程级配置」与「控制面数据库」分离开——用户、存储、共享、权限等动态对象存数据库,dfsctl 可在线管理,无需重启服务。
⚠️ 注意:DittoFS 处于 pre-1.0 实验阶段,配置键与磁盘格式可能在不通知的情况下变化;升级前阅读 Release Notes。
一、环境信息
- 测试环境:CentOS 8.4 / Ubuntu 22.04(x86_64),DittoFS v0.34.1
- 配置文件默认位置:
$XDG_CONFIG_HOME/dittofs/config.yaml(典型~/.config/dittofs/config.yaml) - 状态目录:
$XDG_STATE_HOME/dittofs(典型~/.local/state/dittofs,存放日志与 PID 文件) - 配置查看命令:
dfs config show --config <path> - 配置校验命令:
dfs config validate --config <path> - 支持格式:YAML(
.yaml/.yml)与 TOML(.toml)
二、前置条件
- 已按安装指南完成 DittoFS 安装(
dfs/dfsctl位于 PATH)。 - 已执行
dfs init生成配置文件。 - 以具备配置文件读写权限的账号操作。
三、配置查看与修改方式
3.1 生成默认配置
dfs init
# 或指定路径
dfs init --config /etc/dittofs/config.yaml
# 覆盖已存在的配置
dfs init --force
3.2 查看当前配置
dfs config show
# 指定配置文件 / JSON 输出 / 查看自动推导的块存储默认值
dfs config show --config /etc/dittofs/config.yaml
dfs config show --output json
dfs config show --deduced
💡 说明:
dfs config show中 JWT secret 显示为'********'(不会明文回显)。
3.3 校验配置
dfs config validate --config /etc/dittofs/config.yaml
# Configuration file: /etc/dittofs/config.yaml
# Validation: OK
#
# Configuration summary:
# Database type: sqlite
# API host: 127.0.0.1
# API port: 8080
# API TLS: false
# Log level: INFO
3.4 修改方式
- 直接编辑配置文件后重启服务(
systemctl restart dfs)。 - 通过环境变量覆盖(适合 Kubernetes/systemd 等托管场景注入),优先级高于配置文件。
- 动态对象(用户/存储/共享/权限)通过
dfsctl在线管理,存控制面数据库,无需重启。
四、两层配置模型
| 层 | 载体 | 内容 | 修改方式 |
|---|---|---|---|
| 进程级配置 | config.yaml(或 TOML) | 日志、控制面 API、数据库连接、blockstore journal、适配器、指标 | 改文件/环境变量 + 重启 |
| 控制面数据库 | SQLite / PostgreSQL | 用户、组、共享、权限、存储定义 | dfsctl 在线管理,即时生效 |
配置文件默认位置与格式(dfs init 生成,实测真实内容关键字段):
# Logging configuration
logging:
level: "INFO" # DEBUG, INFO, WARN, ERROR
format: "text" # text, json
output: "~/.local/state/dittofs/dittofs.log" # stdout/stderr/文件路径
rotation:
max_size: 100 # MB
max_backups: 5
max_age: 30 # 天
compress: false
shutdown_timeout: 30s
database:
type: sqlite # sqlite | postgres
sqlite:
path: "" # 默认 $XDG_CONFIG_HOME/dittofs/controlplane.db
controlplane:
host: "127.0.0.1" # 默认仅回环;多主机部署改 0.0.0.0
port: 8080
read_timeout: 10s
write_timeout: 10s
idle_timeout: 60s
# require_initial_password_change: false
# tls: { cert_file, key_file, client_ca, min_version }
jwt:
secret: "<自动生成,生产用 DITTOFS_CONTROLPLANE_SECRET>"
access_token_duration: 15m
refresh_token_duration: 168h # 7 天
# 可选:metadata.badger.block_cache_mb / index_cache_mb
admin:
username: "admin"
email: ""
password_hash: "" # 留空则首启自动生成密码
五、环境变量覆盖
所有配置键均可通过环境变量覆盖,规则:DITTOFS_ + 大写键路径,嵌套点号转下划线。
| 环境变量 | 对应配置键 | 默认值 |
|---|---|---|
DITTOFS_LOGGING_LEVEL | logging.level | INFO |
DITTOFS_LOGGING_OUTPUT | logging.output | stdout |
DITTOFS_DATABASE_TYPE | database.type | sqlite |
DITTOFS_CONTROLPLANE_HOST | controlplane.host | 127.0.0.1 |
DITTOFS_CONTROLPLANE_PORT | controlplane.port | 8080 |
DITTOFS_CONTROLPLANE_SECRET | controlplane.jwt.secret | 随机生成 |
DITTOFS_ADMIN_INITIAL_PASSWORD | —(首次启动引导 admin 密码) | 随机生成 |
DITTOFS_ADAPTERS_NFS_PORT | adapters.nfs.port | 12049 |
DITTOFS_ADAPTERS_NFS_PORTMAPPER_ENABLED | adapters.nfs.portmapper.enabled | false |
DITTOFS_ADAPTERS_NFS_PORTMAPPER_PORT | adapters.nfs.portmapper.port | 10111 |
DITTOFS_ADAPTERS_SMB_PORT | adapters.smb.port | 12445 |
示例:
DITTOFS_LOGGING_LEVEL=DEBUG dfs start --foreground
DITTOFS_ADAPTERS_NFS_PORT=2049 dfs start --foreground
💡 配置优先级:环境变量 > 配置文件 > 内置默认值。
六、日志配置(logging)
| 键 | 默认值 | 说明 |
|---|---|---|
logging.level | INFO | 日志级别:DEBUG/INFO/WARN/ERROR |
logging.format | text | 输出格式:text(人类可读,支持彩色)/ json(结构化,适合 ES/Loki 采集) |
logging.output | stdout | 输出目标:stdout/stderr/文件路径 |
logging.rotation.max_size | 100 | 单日志文件最大体积(MB) |
logging.rotation.max_backups | 5 | 保留备份文件数 |
logging.rotation.max_age | 30 | 备份保留天数 |
logging.rotation.compress | false | 是否 gzip 压缩备份 |
json 格式示例:
{"time":"2026-10-06T16:38:26Z","level":"INFO","msg":"Starting DittoFS server","component":"server","version":"0.34.1"}
七、控制面数据库(database)
| 类型 | 说明 | 适用场景 |
|---|---|---|
sqlite | 内嵌 SQLite | 单节点(默认) |
postgres | PostgreSQL | 高可用、多节点 |
SQLite 配置:
| 键 | 默认值 | 说明 |
|---|---|---|
database.sqlite.path | $XDG_CONFIG_HOME/dittofs/controlplane.db | 数据库文件路径 |
PostgreSQL 配置(database.postgres):
| 键 | 默认值 | 说明 |
|---|---|---|
host | 必填 | PostgreSQL 主机 |
port | 5432 | 端口 |
database | 必填 | 数据库名 |
user | 必填 | 用户名 |
password | 必填 | 密码(建议 ${POSTGRES_PASSWORD} 环境变量引用) |
sslmode | disable | disable/require/verify-ca/verify-full |
ssl_root_cert | 空 | CA 证书路径 |
max_open_conns | 25 | 最大打开连接数 |
max_idle_conns | 5 | 最大空闲连接数 |
💡 说明:控制面数据库启动时自动建表并执行迁移;含 schema 变更的版本升级后建议执行
dfs migrate(可重复执行,安全)。
八、控制面 API(controlplane)
| 键 | 默认值 | 说明 |
|---|---|---|
controlplane.host | 127.0.0.1 | 绑定地址。默认仅回环(单机安全默认);多主机/Kubernetes 改 0.0.0.0 并加 TLS |
controlplane.port | 8080 | HTTP/HTTPS 端口 |
controlplane.read_timeout | 10s | 读请求超时 |
controlplane.write_timeout | 10s | 写响应超时 |
controlplane.idle_timeout | 60s | keep-alive 空闲超时 |
controlplane.drain_stall_timeout | 5m | POST /api/v1/system/drain-uploads 无进展中止窗口(仅远端停滞时中止,非总量上限) |
controlplane.require_initial_password_change | true | 引导 admin 首次登录强制改密;设置 DITTOFS_ADMIN_INITIAL_PASSWORD 时自动跳过 |
controlplane.pprof | false | 暴露 /debug/pprof/* 性能剖析端点(仅诊断用) |
controlplane.pprof_mutex_rate | 100(pprof 开启时) | 互斥锁竞争采样率 |
controlplane.pprof_block_rate_ns | 1000000(pprof 开启时) | 阻塞采样间隔(ns) |
8.1 JWT 配置(controlplane.jwt)
| 键 | 默认值 | 说明 |
|---|---|---|
secret | 必填(dfs init 自动生成) | HMAC 签名密钥,至少 32 字符 |
access_token_duration | 15m | 访问令牌有效期 |
refresh_token_duration | 168h | 刷新令牌有效期(7 天) |
⚠️ 安全注意:生产环境不要把 JWT 密钥写进配置文件,用环境变量注入:
export DITTOFS_CONTROLPLANE_SECRET=$(openssl rand -hex 32)(64 字符 hex,32 字节熵)。该变量仅在首次启动初始化时写入控制面数据库,后续改动需同时更新配置与数据库。
8.2 TLS 配置(controlplane.tls)
DittoFS 提供原生基于文件的 TLS:只加载证书文件,不做签发/续期/轮换(非 CA,无 ACME);文件在磁盘更新后自动热加载,无需重启。
| 键 | 默认值 | 说明 |
|---|---|---|
cert_file | 未设置 | PEM 服务器证书(或证书链)。与 key_file 同时设置才启用 HTTPS;只设其一为致命配置错误 |
key_file | 未设置 | 对应私钥 |
client_ca | 未设置 | PEM CA 包;设置后要求并校验客户端证书(mTLS) |
min_version | 1.2 | 最低 TLS 版本:1.2 / 1.3 |
controlplane:
host: 0.0.0.0
port: 8080
tls:
cert_file: /etc/dittofs/tls/tls.crt
key_file: /etc/dittofs/tls/tls.key
client_ca: /etc/dittofs/tls/ca.crt # 可选 → mTLS
min_version: "1.2"
💡 部署建议:边缘层用 Nginx/Ingress/Service Mesh 终结 TLS,DittoFS 原生 TLS(或 mTLS)作为非 Kubernetes 主机与直连
dfsctl的安全底线。
8.3 常用 API 端点
| 端点 | 方法 | 说明 |
|---|---|---|
/ | GET | 健康检查(返回 {"status":"healthy",...};/healthz 为 404) |
/api/v1/auth/login | POST | 认证获取令牌 |
/api/v1/auth/refresh | POST | 刷新访问令牌 |
/api/v1/users | GET/POST | 列出/创建用户 |
/api/v1/users/{id} | GET/PUT/DELETE | 获取/更新/删除用户 |
/api/v1/groups | GET/POST | 列出/创建组 |
/api/v1/shares | GET/POST | 列出/创建共享 |
/api/v1/shares/{id} | GET/PUT/DELETE | 获取/更新/删除共享 |
九、块存储与 journal(blockstore)
每个共享有恰好一个块存储(内容的持久归宿),前面还有一个落盘的 journal(写前日志)。块存储由 dfsctl store block 创建,类型只有 s3 与 memory;journal 是服务级自动预置的,无需创建,位置由 blockstore.journal.path 决定,每个共享一个子目录 <path>/shares/<共享名>/journal/。
blockstore:
journal:
path: /var/lib/dittofs/blocks # journal 根目录;默认 <状态目录>/blocks
chunk_size: 0 # FastCDC 最小分块大小;0 = 内置配置
chunk_max: 0 # 覆盖推导的最大分块;0 = 由 chunk_size 推导
dirty_expire: ... # 脏块过期时间
写入路径:写入先追加到 journal(本地确认)→ 后台 flush 把脏区间打包成块搬运到块存储 → 已同步的段在空间压力或显式 drain 时回收。journal 不是第二副本:一旦段被回收,字节只存在于块存储。
⚠️ 重要:
memory块存储在服务重启后内容即失;s3块存储必须指向真实 bucket 才是持久化方案。journal 承载所有「尚未到达块存储」的字节的唯一副本,所在目录必须持久化。
十、协议适配器(adapters)
适配器(NFS/SMB)通过 dfsctl adapter 管理,配置键与端口:
| 键 | 默认值 | 说明 |
|---|---|---|
adapters.nfs.port | 12049 | NFS 端口(标准端口方案 2049) |
adapters.nfs.portmapper.enabled | false | 启用内嵌 portmapper |
adapters.nfs.portmapper.port | 10111 | portmapper 端口(标准 111) |
adapters.smb.port | 12445 | SMB 端口(标准 445) |
标准端口(生产)对照:
| 服务 | 默认(非特权) | 标准(生产) |
|---|---|---|
| NFS | 12049 | 2049 |
| SMB | 12445 | 445 |
| Portmapper | 10111 | 111 |
使用标准端口需要:(1) 释放宿主系统占用(systemctl disable --now nfs-server rpcbind smbd nmbd);(2) 允许绑定低端口(root 运行,或 setcap 'cap_net_bind_service=+ep' /usr/local/bin/dfs,或 systemd 加 AmbientCapabilities=CAP_NET_BIND_SERVICE)。
十一、指标(Prometheus)
DittoFS 没有 OpenTelemetry/分布式追踪子系统。可观测性通过可选的 Prometheus /metrics 端点提供,在独立监听器上启用(observability/metrics 配置块)。默认不启用,端口 9090 默认不监听——需要指标时在配置中启用并重启服务,然后以 curl -s http://127.0.0.1:9090/metrics 验证。
十二、管理员账号(admin)
| 键 | 默认值 | 说明 |
|---|---|---|
admin.username | admin | 引导管理员用户名 |
admin.email | 空 | 管理员邮箱 |
admin.password_hash | 空(首启自动生成/由环境变量指定) | 密码哈希 |
⚠️ 首次启动密码:
DITTOFS_ADMIN_INITIAL_PASSWORD未设置且后台模式(systemd)下,自动生成的密码不会显示、无法找回。务必首启前设置。
十三、生产配置模板
13.1 单机开发测试(默认 SQLite + 内存块存储)
dfs init --config /etc/dittofs/config.yaml
DITTOFS_ADMIN_INITIAL_PASSWORD=Your-Strong-Pass-123! dfs start --foreground --config /etc/dittofs/config.yaml
13.2 生产单机(SQLite + S3 块存储 + 标准端口)
logging:
level: "INFO"
format: "json"
output: "/var/log/dittofs/dittofs.log"
shutdown_timeout: 30s
database:
type: sqlite
sqlite:
path: /var/lib/dittofs/controlplane.db
controlplane:
host: 127.0.0.1
port: 8080
tls:
cert_file: /etc/dittofs/tls/tls.crt
key_file: /etc/dittofs/tls/tls.key
min_version: "1.3"
jwt:
secret: "${DITTOFS_CONTROLPLANE_SECRET}"
access_token_duration: 15m
refresh_token_duration: 168h
blockstore:
journal:
path: /var/lib/dittofs/blocks
adapters:
nfs:
port: 2049
portmapper:
enabled: true
port: 111
smb:
port: 445
配合 setcap 'cap_net_bind_service=+ep' /usr/local/bin/dfs,块存储指向真实 S3 bucket:
dfsctl store block add --name s3main --type s3 --bucket my-bucket --region us-east-1 --prefix dittofs
dfsctl share edit /export --block-store s3main
13.3 高可用多节点(PostgreSQL 控制面)
database:
type: postgres
postgres:
host: pg01.example.com
port: 5432
database: dfs
user: dfs
password: ${POSTGRES_PASSWORD}
sslmode: verify-full
ssl_root_cert: /etc/dittofs/tls/pg-ca.crt
controlplane:
host: 0.0.0.0
port: 8080
tls:
cert_file: /etc/dittofs/tls/tls.crt
key_file: /etc/dittofs/tls/tls.key
⚠️ 多主机场景
controlplane.host必须改为0.0.0.0并配 TLS,否则管理面只监听回环无法被其他主机访问。
十四、常见问题(FAQ)
Q1:dfs config show 里 JWT secret 是 ********?
正常,出于安全不回显明文。生产用 DITTOFS_CONTROLPLANE_SECRET 环境变量注入。
Q2:环境变量与配置文件哪个优先?
环境变量优先。DITTOFS_ + 大写键路径(点号转下划线)覆盖配置文件对应键。
Q3:改了 config.yaml 不生效?
进程级配置在启动时读取,需重启服务(systemctl restart dfs)。用户/共享/权限等控制面对象用 dfsctl 修改,即时生效。
Q4:启用 2049/445 标准端口失败?
先释放宿主占用(systemctl disable --now nfs-server rpcbind smbd nmbd),再授予绑定低端口能力(setcap 或 systemd AmbientCapabilities),最后确认无残留占用:ss -tulpn | grep -E ':(2049|445|111)\b'。
Q5:9090 端口没在监听?
Prometheus /metrics 默认不启用。需在配置中启用 observability/metrics 并重启服务,详见「十一、指标」。
十五、参考链接
- 官方仓库:
https://github.com/marmos91/dittofs - 官方配置文档:
https://dittofs.io/ - 官方文档(GitHub docs):
https://github.com/marmos91/dittofs/tree/main/docs