LedgerSMB 1.13.8 配置参数详解
LedgerSMB 1.13.8 配置体系精读:ledgersmb.yaml 加载与片段合并顺序、环境变量接线(config.sh 实查)、cookie/db/mail/logging/miscellaneous 等 16 组参数逐项解读与生产要点,配置覆盖经运行实例功能验证(2026-10-24 实测)。
LedgerSMB 1.13.8 配置参数详解
目标:讲清 LedgerSMB 1.13.8 的配置体系——配置文件从哪里读、按什么顺序合并、环境变量如何接线,并逐组解读全部配置键。所有默认值与行为均取自实测实例(1.13.8)与实例内置的官方带注释配置样例,实测日期 2026-10-24。
一、环境信息
| 项 | 值 |
|---|---|
| 软件版本 | LedgerSMB 1.13.8(当前稳定版) |
| 配置文件实测位置 | /srv/ledgersmb/local/conf/(运行实例生成);官方带注释样例 /srv/ledgersmb/doc/conf/ledgersmb.yaml |
| 配置加载代码 | /srv/ledgersmb/bin/ledgersmb-server.psgi(第 72-128 行,实测源码) |
| 环境变量接线代码 | 镜像内 /usr/local/bin/config.sh(实测源码) |
| 素材来源 | 运行实例实查 + GitHub ledgersmb/LedgerSMB 1.13.8 与 ledgersmb/ledgersmb-docker 1.13 分支(查询日期 2026-10-24) |
说明:LedgerSMB 自 1.9 起配置从旧版 ledgersmb.conf(INI 格式)迁移到 ledgersmb.yaml(YAML 格式),1.13 仍保留对旧 INI 的兼容读取(加载顺序里排在最后),但官方样例与本文均以 YAML 为准。
二、配置体系与加载顺序
实测源码(bin/ledgersmb-server.psgi)给出的解析与合并规则如下:
第 1 步:确定主配置文件(按顺序取第一个存在的,相对应用目录 /srv/ledgersmb):
- 环境变量
LSMB_CONFIG_FILE指定的路径 ledgersmb.yaml(推荐)ledgersmb.ymlledgersmb.conf(旧版 INI,仅兼容)- 全都不存在 → 使用程序内置默认配置(与 doc/conf/ledgersmb.yaml 同内容)
第 2 步:逐层合并(后合并者覆盖先合并者,同键后者胜):
内置默认配置
← 主配置文件(ledgersmb.yaml)
← 同目录下所有 ledgersmb.NNN.yaml 递增编号片段,按编号从大到小依次合并
(即编号越小越后合并、优先级越高;镜像默认片段为 000/001/002/003)
镜像启动时的自动生成:容器启动时 config.sh 检查 /srv/ledgersmb/local/conf/(不存在则创建),若主文件缺失则按环境变量生成 ledgersmb.yaml,并按邮件变量生成 ledgersmb.000.yaml(SMTP 主机)、ledgersmb.001.yaml(端口)、ledgersmb.002.yaml(helo)、ledgersmb.003.yaml(SASL 认证)。因此把宿主目录挂载到 /srv/ledgersmb/local/conf 是官方推荐的配置外置方式:自己的片段放进去、重启即生效,生成文件也会写进同一目录。
实测验证(本专栏部署篇实例,追加片段 ledgersmb.100.yaml):
# /srv/ledgersmb/local/conf/ledgersmb.100.yaml(实测)
logging:
level: DEBUG
login_settings:
default_db: demo1
重启后不带 company 参数登录,实测登录接口直接落到 demo1 公司库:
curl -s -X POST 'http://localhost:8130/login.pl?__action=authenticate' \
-H 'Content-Type: application/json' \
-d '{"login":"admin","password":"q1w2e3r4"}'
# { "target": "e368b9938746fa090d6afd3628355133/erp.pl?user=admin" }
返回 target 路径为 e368b9938746fa090d6afd3628355133 = md5("demo1")(实测 echo -n demo1 | md5sum 一致),证明片段中的 login_settings.default_db: demo1 已覆盖内置默认值并生效。
💡 独特之处:应用的配置文件里没有任何数据库口令。LedgerSMB 的数据库连接按"会话用户"认证——业务用户登录用的就是该用户在 PostgreSQL 里的角色口令;数据库管理员(setup.pl)凭据走 HTTP Basic 认证。因此配置文件的敏感面比常见 Web 应用小得多,但仍建议限制 local/conf 目录权限(邮件 SASL 片段 003 里会落 SMTP 口令明文)。
三、配置参数逐组详解
以下键名与默认值实测自实例内置官方样例(doc/conf/ledgersmb.yaml,!book 注释即官方键名标记),括号内为实测默认值:
3.1 cookie — 会话 Cookie
| 键 | 默认值 | 说明 |
|---|---|---|
| cookie.name | LedgerSMB | 会话 Cookie 名;同域名并行运行多个版本时改为 LedgerSMB-<版本号> 防串号 |
| cookie.secret | (空) | 留空则每次启动动态生成——多工作进程/重启后旧会话失效;跨进程稳定会话需显式设置 |
3.2 db — 数据库连接
| 键 | 默认值 | 说明 |
|---|---|---|
| db.$class | LedgerSMB::Database::Factory | 连接工厂类 |
| db.connect_data | sslmode: disable(官方样例);镜像生成的实例另含 host: postgres、port: 5432 | libpq 连接参数全支持(host/port/sslmode/application_name 等),关键字清单见 PostgreSQL 官方 libpq 文档 |
| db.schema | (注释示例 public) | LedgerSMB 对象所在 schema |
| db.data_dir / db.source_dir | $ref: paths/sql_data / paths/sql | 建 schema 后立即装载的参照数据目录 / schema 定义与变更 SQL 目录 |
⚠️ 官方样例默认
sslmode: disable:应用与数据库同机/同内网时常见,但跨网络部署务必改require及以上级别。
3.3 default_locale — 界面语言
| 键 | 说明 |
|---|---|
| default_locale.$class | LedgerSMB::LanguageResolver:按请求头 Accept-Language 协商语言 |
| default_locale.directory | $ref: paths/locale(./locale/po),*.po 与 *.json 翻译文件目录 |
实测示例:默认实例登录页 HTML 带 lang="es-ve"(镜像构建语言协商的实测结果),说明未显式配置时由 Accept-Language 决定;中文界面把该头设为 zh 系即可命中随附翻译(项目自称 45 种语言)。
3.4 environment_variables — 子进程环境白名单
实测默认:PATH: /bin:/usr/bin:/usr/local/bin:/usr/local/pgsql/bin。应用把执行环境整体清空、只放行白名单变量(LedgerSMB::EnvVarSetter),这是模板 LaTeX/打印机命令执行的安全边界,一般无需改动。
3.5 extra_middleware — 中间件扩展点
实测默认 []。可插入 Plack::Middleware 实现定制请求处理;官方在 doc/conf/ledgersmb.yaml.debug 给了带调试中间件的完整样例。
3.6 logging — 日志
| 键 | 默认值 | 说明 |
|---|---|---|
| logging.level | ERROR | 全局日志级别,合法值同 Log::Log4perl(TRACE/DEBUG/INFO/WARN/ERROR/FATAL);实测置 DEBUG 重启后生效 |
| logging.file | (空) | 指向精细 Log4perl 配置;最小样例 doc/conf/ledgersmb.log.conf.simple 实测内容为 log4perl.rootlogger = ERROR, Screen + Screen Appender(PatternLayout) |
3.7 login_settings — 登录默认值
| 键 | 官方样例默认 | 说明 |
|---|---|---|
| login_settings.default_db | ledgersmb | 登录时未指定公司(company)使用的默认数据库;实测改为 demo1 后无 company 登录直达 demo1(见第二节) |
3.8 mail — 发信
官方样例给出两种 mail.transport:
- Sendmail 方式(样例默认):
$class: Email::Sender::Transport::Sendmail,可用path指定 sendmail 兼容二进制(注释示例 /usr/bin/ssmtp) - SMTP 方式:
$class: Email::Sender::Transport::SMTP+host/port/ssl/sasl_authenticator($class: Authen::SASL、mechanism: PLAIN、callback user/pass)
实测实例生成结果(镜像默认环境变量驱动):
# /srv/ledgersmb/local/conf/ledgersmb.000.yaml(实测)
mail:
transport:
host: 10.89.72.1 # __CONTAINER_GATEWAY__ 特殊值被解析为默认网关 IP
# /srv/ledgersmb/local/conf/ledgersmb.yaml(实测,节选)
mail:
transport:
$class: Email::Sender::Transport::SMTP
ssl: none
3.9 miscellaneous — 杂项
| 键 | 官方样例默认 | 镜像生成实测 | 说明 |
|---|---|---|---|
| miscellaneous.backup_email_from | '' | 同 | 备份邮件的 From 地址 |
| miscellaneous.max_upload_size | 4194304 | 同 | 上传上限,4 MiB;大附件场景需调大(同时受中间件 max_post_size 引用) |
| miscellaneous.proxy_ip | 127.0.0.1/8 ::1/128 ::ffff:127.0.0.1/108 | 172.17.0.1/12 | 可信反代地址段:只有来自这些地址的 X-Forwarded-/X-Request 头才会被采信,生产接 TLS 反代时必须改成实际代理网段 |
3.10 output_formatter — 输出格式插件链
实测默认插件链(顺序即官方样例):LaTeX→PDF、LaTeX→PS、XLSX→XLS、XLSX→XLSX、ODS、CSV、TXT、HTML、External(外部命令自定义转换,样例 command: /bin/true %d %f %o)。这是发票/报表多格式导出的引擎;默认以 LaTeX 为 PDF 源,也允许 HTML→PDF 类自定义插件替换。
3.11 paths — 路径中枢
实测默认(相对 /srv/ledgersmb):locale: ./locale/po、sql: ./sql、sql_data: ./locale、templates: ./templates、UI: ./UI、UI_cache: lsmb_templates、workflows: [./workflows, ./custom_workflows]。其他配置组用 $ref 引用这里,改路径一处生效。
3.12 printers — 服务器侧打印机
实测默认:Laser: lpr -Plaser、Epson: lpr -PEpson、fallback: Laser。定义系统内"打印"动作可用的管道命令。
3.13 reconciliation_importer — 银行流水导入解析器
实测默认四套配置:OFX、ISO 20022 CAMT.053、PayPal CSV(按列名)与 PayPal CSV(按列号),CSV 解析器支持 first_row(headers/data)、mapping(source/amount/type/date 到列的映射)、金额格式(如 1'000.00)与日期格式(如 DD/MM/YYYY)。对账导入其他银行流水照此结构新增片段即可。
3.14 setup_settings — setup.pl 专用
| 键 | 默认值 | 说明 |
|---|---|---|
| setup_settings.admin_db | template1 | setup.pl 未指定公司库时登录的库 |
| setup_settings.auth_db | postgres | 校验数据库管理员凭据所用的库——这就是部署篇 setup.pl 用 postgres 账号登录的底层依据 |
3.15 ui — 界面模板
实测默认:ui.class: LedgerSMB::Template::UI、method: new_UI、lifecycle: eager、args.cache: $ref paths/UI_cache、args.root: $ref paths/UI;注释项 ui.stylesheet(默认 ledgersmb.css)可全局换肤。
3.16 workflows — 工作流定义
实测默认:LedgerSMB::Workflow::Loader(eager),directories: [./workflows, ./custom_workflows]——排前者同名覆盖排后者,业务审批流(如销售单审批)自定义定义文件放 custom_workflows。
四、容器环境变量(与配置文件的接线关系)
以下为官方镜像(ledgersmb/ledgersmb:1.13.8,镜像内实测 Config.Env + config.sh 源码)提供的环境变量及其落地位置:
| 变量 | 镜像默认 | 落地 |
|---|---|---|
| POSTGRES_HOST / POSTGRES_PORT | postgres / 5432 | 生成 db.connect_data.host/port |
| LSMB_MAIL_SMTPHOST | __CONTAINER_GATEWAY__ | 生成 ledgersmb.000.yaml mail.transport.host;特殊值解析为容器默认网关 IP(实测 10.89.72.1) |
| LSMB_MAIL_SMTPPORT | (空) | 生成 ledgersmb.001.yaml mail.transport.port |
| LSMB_MAIL_SMTPSENDER_HOSTNAME | (空) | 生成 ledgersmb.002.yaml mail.transport.helo |
| LSMB_MAIL_SMTPTLS | (空) | 主文件 mail.transport.ssl:yes→ssl、raw→raw;空→none |
| LSMB_MAIL_SMTPUSER / SMTPPASS / SMTPAUTHMECH | (空) | 生成 ledgersmb.003.yaml SASL 认证段 |
| LSMB_WORKERS | 2(官方 README) | Starman HTTP 工作进程数(部署篇实例设 5);面向 1GB 内存机器的默认值,内存富余可加大提升并发 |
| LSMB_BIND_ADDRESS | 0.0.0.0:5762 | Starman 监听地址 |
| PROXY_IP | 172.17.0.1/12 | 生成 miscellaneous.proxy_ip |
| LSMB_CONFIG_FILE | (空) | 指定主配置文件路径(优先级最高) |
| DEFAULT_DB | lsmb | 实测 1.13.8 镜像 config.sh 未引用该变量(脚本内无接线);等效能力由 login_settings.default_db 提供,建议直接用配置键 |
兼容说明:镜像对旧 ssmtp 系变量(SSMTP_MAILHUB、SSMTP_AUTH_USER 等)保留自动映射并输出 deprecated 告警(实测 config.sh 逻辑),新部署直接用 LSMB_MAIL_* 即可。
五、生产配置要点(基于上述参数的组合建议)
- TLS 与代理:前置反代终结 HTTPS 后,把
miscellaneous.proxy_ip改为反代实际地址段(镜像默认 172.17.0.1/12 只适配默认网桥场景),否则客户端 IP 与协议判断失真;Safari 用户全靠 HTTPS。 - 数据库传输安全:
db.connect_data.sslmode生产改require及以上;跨主机连库同时核对 host/port。 - 会话稳定:多进程/多实例部署显式设置
cookie.secret,避免动态 secret 造成会话互踢;同一域名多版本并行用cookie.name区分。 - 上传与导出:
max_upload_size默认 4 MiB;PDF 导出依赖 output_formatter 的 LaTeX 插件链,服务器需保证 LaTeX 工具链可用(官方镜像已含)。 - 日志排障:
logging.level调 DEBUG 重启即生效(本文实测),精细控制用logging.file指向独立 Log4perl 配置;生产常态保持 ERROR 减噪。 - 配置变更路径:改配置 → 重启应用进程即可,无需动数据库;片段编号法便于叠加第三方集成配置而不碰主文件。
六、快速排障对照
| 症状 | 检查点 |
|---|---|
| 配置改动不生效 | 确认挂在 /srv/ledgersmb/local/conf;片段必须叫 ledgersmb.<数字>.yaml;主文件存在时启动只合并不重新生成 |
| 启动即崩溃报 Invalid log level | logging.level 拼写非法(合法值见 Log::Log4perl) |
| 数据库连接失败 | db.connect_data 的 host/port/sslmode 与 libpq 关键字核对;服务名解析(部署篇约定 postgres) |
| 客户端 IP 显示为网关地址 | miscellaneous.proxy_ip 未包含真实反代来源 |
| 系统内发信失败 | 看 ledgersmb.000-003 片段生成的 SMTP 主机/端口/SASL;__CONTAINER_GATEWAY__ 需要宿主侧有真实邮件转发 |
| setup.pl 无法用数据库管理员登录 | setup_settings.auth_db 默认 postgres 库被变更或管理员口令不符 |
七、参考
- 官方带注释配置样例(1.13.8 源码内):https://github.com/ledgersmb/LedgerSMB/blob/1.13.8/doc/conf/ledgersmb.yaml
- 官方镜像环境变量文档:https://github.com/ledgersmb/ledgersmb-docker/blob/1.13/README.md
- libpq 连接参数官方文档:https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS
- 本专栏同系列:部署实操见《LedgerSMB 1.13.8 Docker Compose 部署指南》;产品认知见《LedgerSMB 1.13.8 介绍与选型指南》;接口调用见《LedgerSMB 1.13.8 API 使用详解》。