Roundup 2.6.0 配置参数详解

Roundup 2.6.0 配置参数详解

Roundup项目管理任务管理自托管2026/10/24

Roundup 2.6.0 配置参数详解

目标:逐节逐参数讲解 Roundup 2.6.0 tracker 实例的 config.ini 配置体系(11 个配置节、80 余个参数),每个核心参数给出默认值、取值范围、生效方式与实测验证;并给出可直接落地的生产配置模板。已基于 roundup-2.6.0 发行包默认配置文件与实际运行的 tracker 实例(Ubuntu 22.04,Python 3.10.12)逐项实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS
  • Python:3.10.12;Roundup:2.6.0(venv 路径 /opt/roundup-venv)
  • tracker 实例:/opt/trackers/support(classic 模板,sqlite 后端)
  • 配置文件:/opt/trackers/support/config.ini(由 roundup-admin install 自动生成,生成头注释 Autogenerated at Sat Oct 24 04:32:07 2026)
  • 服务托管:systemd 单元 roundup-server.service,监听 0.0.0.0:8080
  • Web 路径:http://localhost:8080/support/
  • 管理账号:admin / q1w2e3r4
  • 对照基准:roundup-2.6.0 官方发行包内 roundup/configuration.py 生成的默认配置模板(全部参数默认值以此为准)

二、前置条件

按本专栏《Roundup 2.6.0 安装指南(Ubuntu 22.04)》一篇完成安装:tracker 实例已初始化、roundup-server 服务已托管并可通过 http://localhost:8080/support/ 访问。C1 是专题篇,不重复安装步骤,但本章每个示例配置改动均可独立执行——每处改动后执行 systemctl restart roundup-server 并用对应验证命令确认效果。

验证服务与页面基线正常:

systemctl is-active roundup-server
curl --noproxy "*" -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/support/

实测回显:

active
200

三、配置文件查看与修改方式

3.1 配置文件位置与分层

Roundup 的配置分两层:

  1. 实例层:<tracker目录>/config.ini——tracker 实例的全部业务参数(数据库、邮件、Web 行为、安全),本篇主角;
  2. 服务层:roundup-server 进程参数(监听地址、端口、日志、多进程模式、SSL)——写在 systemd 单元的 ExecStart 行,或持久化为 roundup-server 专用配置文件(roundup-server -S 生成、-C 引用)。

实例层结构:INI 格式,# 开头为注释;每个参数注释块尾部的 # Default: <值> 即该参数出厂默认值。生成文件中未显式写出的参数均取默认值。

3.2 修改与生效方式

config.ini 在进程启动时读取一次,修改后必须重启服务:

sed -i "s|^name = Roundup issue tracker|name = 运维支持工单系统|" /opt/trackers/support/config.ini
systemctl restart roundup-server

实测验证(页面 <title> 会拼上 tracker 名):

curl --noproxy "*" -s http://localhost:8080/support/ | sed -n "/<title>/,/<\/title>/p"

实测回显(改名前为 List of issues - Roundup issue tracker):

<title>
  List of issues
   - 运维支持工单系统
</title>

3.3 配置工具:genconfig 与 updateconfig

roundup-admin 内置两个配置辅助命令:

/opt/roundup-venv/bin/roundup-admin genconfig /tmp/full-config.ini

实测回显:成功时无输出,/tmp/full-config.ini 生成一份含全部参数与注释的完整模板(与发行包默认模板一致)。

updateconfig 则用于把老实例的 config.ini 升级到新版本参数集(roundup-admin -i <实例> updateconfig <新文件>),升级版本时常用。

四、参数总览(11 节全表)

以下表格逐节列出全部参数与出厂默认值(实查自 roundup-2.6.0 发行包默认配置模板),关键差异与用途在第五~十一章逐一展开。

[main] 实例核心

参数默认值作用
databasedb数据库目录(相对 tracker 目录)
template_enginezopetal模板引擎(zopetal/chameleon/jinja2)
templateshtml模板目录
static_files(空)静态文件目录覆盖
admin_emailroundup-admin系统告警收件人
dispatcher_emailroundup-admin调度员邮箱(错误邮件指向)
email_from_tag(空)发件人名附加文本
new_web_user_rolesUserWeb 自注册用户默认角色
new_email_user_rolesUser邮件注册用户默认角色
obsolete_history_rolesAdmin可见废弃历史属性的角色
error_messages_touser错误邮件发给 user/dispatcher/both
html_versionhtml4输出 HTML 版本(仅 html4)
timezone0默认时区偏移(装 pytz 后可填时区名)
instant_registrationno注册是否即时生效(否则邮件确认)
email_registration_confirmationyes注册确认走邮件
indexer(空)全文索引器(xapian/whoosh/native/native-fts)
indexer_languageenglish索引语言
indexer_stopwords(空)索引停用词
umask0o2文件创建掩码
csv_field_size131072import 时 CSV 单字段上限
password_pbkdf2_default_rounds250000密码 PBKDF2 轮数(最低 1000)

[tracker] 实例标识

参数默认值作用
nameRoundup issue tracker实例名称(页面标题)
webNO DEFAULT对外访问 URL(必须 http(s):// 开头、/ 结尾)
emailissue_tracker实例收件地址
replyto_address(空)通知邮件 Reply-To(AUTHOR=回作者)
language(空)界面语言(空则按环境变量)

[web] Web 行为与安全(参数多,见第七章分组详解):allow_html_file、http_auth、http_auth_header、dynamic_compression、use_precompressed_files、cookie_takes_precedence、samesite_cookie_setting、login_attempts_min、registration_delay、registration_prevalidate_username、enable_xmlrpc、translate_xmlrpc、enable_rest、translate_rest、rest_logging、api_calls_per_interval、api_interval_in_sec、api_failed_login_limit、api_failed_login_interval_in_sec、use_tokenless_csrf_protection、allowed_api_origins、csrf_* 组、use_browser_language、debug、login_empty_passwords、migrate_passwords、secret_key、jwt_secret、use_browser_date_input、use_browser_number_input 等。

[rdbms] 数据库后端

参数默认值作用
backendsqlite后端(anydbm/sqlite;MySQL/PostgreSQL 亦可)
debug_filterno权限过滤函数调试
nameroundup库名(PG 支持 库.schema)
hostlocalhost数据库主机
port(空)端口
user / passwordroundup / roundup连接凭据
service(空)Oracle service name
read_default_file~/.my.cnfMySQL 凭据文件

[mail] 出站邮件:domain(NO DEFAULT)、host(NO DEFAULT)、username、password(NO DEFAULT)、port=25、local_hostname、tls=no、tls_keyfile、tls_certfile、charset=utf-8、debug、add_authorinfo=yes、add_authoremail=yes。

[mailgw] 入站邮件网关:keep_quoted_text=yes、leave_body_unchanged=no、default_class=issue、language、subject_prefix_parsing=strict、subject_suffix_parsing=strict、subject_suffix_delimiters=[]、subject_content_match=always、subject_updates_title=yes、refwd_re、origmsg_re、sign_re、eol_re、blankline_re(四个正则)、ignore_alternatives=no、convert_htmltotext=none、keep_real_from=no。

[pgp] 邮件 PGP:enable=no、roles、homedir、encrypt=no、require_incoming=signed。

[nosy] 通知控制:messages_to_author=no、signature_position=bottom、add_author=new、add_recipients=new、email_sending=single、max_attachment_size=9223372036854775807(int64 最大,等效不限制)。

[markdown] 消息渲染:break_on_newline=no。

解读:参数虽多但有明确分工——[main]/[tracker] 管实例身份与数据位置,[web] 管界面行为与安全(占一半以上),[rdbms]/[mail]/[mailgw] 管三个外部通道(数据库、出信、收信),[nosy]/[pgp]/[markdown] 是通知与消息渲染的细化开关。

五、[main] 节:实例级核心参数详解

5.1 database——数据库目录

相对 tracker 目录(可写绝对路径),classic 实例默认 db。初始化后该目录下生成 sqlite 库文件:

ls -la /opt/trackers/support/db/

实测回显:

total 352
drwxr-xr-x 2 root root   4096 Oct 24 05:34 .
drwxr-xr-x 7 root root   4096 Oct 24 05:34 ..
-rw-r--r-- 1 root root 348160 Oct 24 05:34 db

💡 说明:备份 tracker 就是备份整个实例目录(config.ini + db/ + html/ + schema.py)。运维惯例把 database 指到独立数据盘(如 /srv/roundup-data/support/db),让业务数据与程序目录分离。

5.2 template_engine 与 templates——模板引擎

template_engine 允许值 zopetal(默认,TAL 风格)/chameleon/jinja2;templates 指定模板目录(默认 html)。实测:把引擎切成 jinja2(先装依赖 pip install jinja2,实测装出 jinja2-3.1.6),重启后服务不报错、HTTP 仍 200,但页面渲染错乱——模板原文被直接输出:

env -u http_proxy -u https_proxy /opt/roundup-venv/bin/pip install jinja2
sed -i "s|^template_engine = zopetal|template_engine = jinja2|" /opt/trackers/support/config.ini
systemctl restart roundup-server
curl --noproxy "*" -s http://localhost:8080/support/ | head -8

实测回显(异常状态:zopetal 模板的注释与 TAL 表达式原样出现在页面上):

<!--
 This is the default body that is displayed when people visit the
 tracker. The tag below lists the currently open issues. You may
 replace it with a greeting message, or a different list of issues or
 whatever. It's a good idea to have the issues on the front page though
-->
<span tal:replace="structure python:db.issue.renderWith('index',
    sort=[('-', 'activity')], group=[('+', 'priority')], filter=['status'],

⚠️ 排障实录:切换 template_engine = jinja2 后「不报错但页面错乱」是最隐蔽的坑——jinja2 引擎读不懂 zopetal(TAL)格式的 html/ 模板,把模板当纯文本回显。classic 模板的 html/ 目录是 zopetal 格式,要用 jinja2 引擎必须同时把 templates 指向 jinja2 格式模板(jinja2 模板实例)。验证改回:template_engine = zopetal + 重启后页面恢复正常(<title> 正常出现)。

5.3 admin_email / dispatcher_email / error_messages_to——系统邮件角色

  • admin_email:系统告警收件人(数据库错误等致命问题发给他);
  • dispatcher_email:调度员,配合 error_messages_to = dispatcher 使用,把用户提交内容的解析错误转给人工处理;
  • 三者省域名时自动拼上 [mail] domain(本实例 domain = example.net,故 admin 实际地址为 roundup-admin@example.net——与安装篇 table user 回显一致)。

5.4 注册与角色:instant_registration / new_web_user_roles

默认 instant_registration = no + email_registration_confirmation = yes:用户 Web 注册后先收确认邮件,点击后才生效,新用户角色 User。内部系统(如企业内网)可改 instant_registration = yes 免邮件确认;更稳妥的做法是保留默认并只把 new_web_user_roles 收紧为 Anonymous(注册后仅匿名权限,由管理员手动提权)。

5.5 indexer 组——全文检索

indexer 允许值:空(自动探测)、native(内部)、native-fts、xapian、whoosh。默认空——Roundup 依可用库自动选择,sqlite 后端下最常用 native-fts(SQLite FTS,无额外依赖)。注意官方注释明确「'native-fts' will only be used if set」——想用 SQLite 全文检索必须显式设值。indexer_language 决定分词语言(默认 english),中文环境可设 chinese;indexer_stopwords 追加停用词。

5.6 timezone 与 password_pbkdf2_default_rounds

  • timezone:界面默认时区,默认 0(UTC);装了 pytz(PyPI extras)可写 Asia/Shanghai,未装只能写整数偏移(如 8);
  • password_pbkdf2_default_rounds:PBKDF2 哈希轮数,默认 250000(2.5.0 起哈希算法为 PBKDF2-SHA512),最低 1000。轮数越大认证越慢、抗暴力破解越强;2.5.0 换 SHA512 后官方说明可酌情调低轮数换取登录速度。

六、[tracker] 节:实例标识参数

6.1 name 与 web

  • name:实例显示名,实测改名立即反映到页面标题(见 3.2 实测回显);
  • web:对外访问地址,注释要求「URL MUST start with http/https scheme and end with '/'」。它是系统自拼链接(通知邮件里的 issue 链接、REST 返回的 link 字段)的根,写错会导致邮件链接 404。本实例实测值 http://localhost:8080/support/——注意路径要带 roundup-server 挂载前缀 /support/。

6.2 email 与 replyto_address

email 是实例对外收件地址(用户回复邮件到该地址即可更新 issue);replyto_address 控制通知邮件的 Reply-To 头:留空用实例地址、AUTHOR 回到修改作者本人(方便线下沟通但暴露邮箱)、或指定任意 RFC2822 地址。

6.3 language

界面语言,留空按 LANGUAGE/LC_ALL/LC_MESSAGES/LANG 环境变量探测。固定中文可设 zh_CN(需对应翻译文件存在)。

七、[web] 节:Web 行为与安全参数详解

7.1 认证开关:http_auth 组

  • http_auth = yes(默认):接受 HTTP Basic 认证(Web 服务器把 REMOTE_USER/HTTP_AUTHORIZATION 传进来即可免密登录);
  • http_auth_header:指定认证头变量名(默认空用 REMOTE_USER);
  • login_empty_passwords = no(默认):禁止空密码账号登录;
  • login_attempts_min = 3:Web 登录失败最少间隔分钟基数(防爆破);
  • migrate_passwords = yes:老哈希在用户登录时自动迁移到当前 PBKDF2-SHA512。

7.2 REST 与 XML-RPC 开关(实测)

enable_rest = yes 与 enable_xmlrpc = yes 默认开启两套远程接口。实测关闭 REST 的效果:

sed -i "s|^enable_rest = yes|enable_rest = no|" /opt/trackers/support/config.ini
systemctl restart roundup-server
curl --noproxy "*" -s -o /dev/null -w "%{http_code}\n" -u admin:q1w2e3r4 http://localhost:8080/support/rest/

实测回显:

404

恢复 enable_rest = yes 并重启后,同一请求恢复 200。XML-RPC 开关同理(关闭后 /support/xmlrpc 端点失效)。rest_logging(默认 none)设为 basic/detail 可记录 REST 调用日志,排查 API 问题时打开。

7.3 API 限流与防爆破

参数默认值含义
api_calls_per_interval0每 interval 允许的 API 调用数;0=不限流
api_interval_in_sec3600限流时间窗(秒)
api_failed_login_limit4时间窗内允许的失败登录次数
api_failed_login_interval_in_sec600失败登录封禁窗(秒)

解读:默认不限流(0)仅靠失败登录封禁(4 次/600 秒)保护;把 REST API 暴露给第三方时建议设 api_calls_per_interval = 10000(每小时万次,按负载调整)。

7.4 CSRF 防护组

参数默认值含义
csrf_enforce_tokenyes强制 CSRF token 校验
csrf_token_lifetime20160token 有效期(分钟,默认 14 天)
csrf_enforce_header_refereryes校验 Referer 头
csrf_enforce_header_originyes校验 Origin 头
csrf_enforce_header_hostyes校验 Host 头
csrf_header_min_count1至少通过的头数量
use_tokenless_csrf_protectionno无 token 降级防护(不推荐开)
allowed_api_origins(空)允许跨域调用 API 的 Origin 白名单

解读:这组参数是 2.x 多个 CVE 加固的产物,生产环境保持默认全开即可;allowed_api_origins 只在第三方网页要调 REST API 时填(逗号分隔)。

7.5 会话与密钥:secret_key / jwt_secret / samesite

  • secret_key:签名会话 Cookie 的密钥,roundup-admin install 时随机生成(本实例生成值 bRLkvAn9HjvMLV4xIBr8Lpe5sjJOR4eFXjVBHuKvFJU=)。多实例/负载均衡部署时必须共享同一密钥,否则会话互不认。支持 file:///绝对路径 语法从文件首行读密钥(密钥不落配置文件,便于秘钥管理);
  • jwt_secret:默认 disabled(不签发 JWT);要启用 REST 的 JWT 认证(第三方向 API 传 JWT)时设为随机值,同样支持 file:///;
  • samesite_cookie_setting = Lax:会话 Cookie SameSite 属性,允许 Lax/Strict/none;需要第三方站点嵌入调用时才放宽。

7.6 传输与压缩

  • dynamic_compression = yes:响应按 Accept-Encoding 动态压缩(需 brotli 库支持 br,纯 gzip 内置);
  • use_precompressed_files = no:启用 .gz/.br 预压缩静态文件;
  • allow_html_file = no(默认):上传的 HTML 文件不做内联 HTML 渲染(XSS 风险开关,保持默认);
  • debug = no:Web 层调试(出错时回显 traceback),生产保持 no。

八、[rdbms] 节:数据库后端参数

backend 允许值:anydbm、sqlite(默认模板注释列出的内置项);生产可切 mysql/postgresql(官方特性页宣称支持,需装对应驱动包)。切换后端不会自动迁移数据——需 roundup-admin exporttables 导出旧库、改 backend、importtables 导入新库。

sqlite(内嵌,无服务)与 MySQL/PostgreSQL(独立服务)的连接参数用法不同:

  • sqlite:仅用 backend,name/host/user/password 全部忽略;
  • MySQL/PostgreSQL:name(库名,PG 可写 库名.schema)、host、port、user、password(支持 file:/// 引用文件);MySQL 还可用 read_default_file = ~/.my.cnf 承载凭据(避免密码落 config.ini)。

💡 技术拓展:Roundup 数据后端怎么选——

后端原理/特点适用场景
anydbmPython 内置键值文件库,单文件小型 tracker、临时评估
sqlite嵌入式关系库,单文件、支持并发读默认推荐,中小团队
mysql独立服务,成熟备份/高可用生态已有 MySQL 运维体系
postgresql独立服务,FTS/权限过滤下沉能力强大型 tracker、配合 native-fts 权限过滤加速

本实例选 sqlite:零外部依赖、备份即拷文件;规模上万 issue 或需多实例共库时再迁 MySQL/PostgreSQL。

九、[mail] 节:出站邮件参数

参数默认值含义
domainNO DEFAULT拼接系统邮箱域名(必填)
hostNO DEFAULTSMTP 服务器地址(必填)
port25SMTP 端口(465/587 配合 tls)
username / password(空)SMTP 认证凭据;password 支持 file:///
tlsno是否启用 TLS(yes 时配 tls_keyfile/tls_certfile 为服务端证书场景)
local_hostname(空)SMTP 握手 HELO 域名
charsetutf-8邮件字符集
add_authorinfo / add_authoremailyes / yes通知邮件是否携带修改者姓名/邮箱

实测基线:本实例 domain = example.net 已设(安装篇 7.2),host 未配——未配 SMTP 时 tracker 的 Web/REST/CLI 功能全部正常,仅通知邮件发不出(邮件进站走 [mailgw] 不依赖此节)。生产最小补齐:host 指向内网 SMTP 中继 + port = 25(免认证中继)或补 username/password。

十、[mailgw] 节:入站邮件网关参数

邮件进站由 roundup-mailgw 程序投递(Postfix alias 或定期 fetch),本节控制解析行为。核心三项:

  • default_class = issue:无法识别主题时新建的条目类型(默认 issue);
  • subject_updates_title = yes:回复邮件改主题会同步更新 issue 标题;
  • keep_quoted_text = yes:保留回复中引用的原文(配 leave_body_unchanged = no 做签名/引用剥离)。

四个正则参数(refwd_re、origmsg_re、sign_re、eol_re/blankline_re)定义「Re:/Fwd: 前缀」「Original Message 分隔线」「签名分隔 -- 」「空行」的识别规则,默认值即通用英文邮件惯例,中文邮件签名格式不同时可调整 sign_re。

十一、[nosy]、[pgp]、[markdown] 节

[nosy](通知名单控制)

参数默认值含义
add_authornew修改者是否加入关注名单(new=仅新话题时加)
add_recipientsnew收件人是否自动加入名单
messages_to_authorno作者是否收自己修改的通知
email_sendingsingle通知发送方式(single=每人一封;group=合并)
max_attachment_size9223372036854775807附件字节上限(int64 最大=不限制;建议生产设 10485760 即 10MB)

[pgp]:enable = no 默认关闭邮件 PGP 签名/加密;启用后 homedir 指向 GnuPG keyring,require_incoming = signed 要求进站邮件必须签名,roles 限定强制签名的角色。

[markdown]:break_on_newline = no——控制 issue 消息是否按 Markdown 渲染及换行语义,默认不启用换行即断行(遵循标准 Markdown)。

十二、生产配置模板

适用场景:8GB 内存、SSD 磁盘、50 人以下团队、内网 SMTP 中继可用的中小型工单/缺陷跟踪部署。以下为 config.ini 需要显式设置/覆盖的参数(未列出的保持默认):

[main]
database = /srv/roundup-data/support/db   ; 数据库独立数据盘
timezone = 8                               ; 无 pytz 时用整数偏移;装 pytz 可写 Asia/Shanghai
indexer = native-fts                       ; SQLite FTS 全文检索
admin_email = roundup-admin
dispatcher_email = roundup-admin

[tracker]
name = 运维支持工单系统
web = https://tracker.example.net/support/ ; 对外正式域名,必须 / 结尾
email = issue_tracker

[web]
allow_html_file = no                       ; 保持关闭(XSS)
csrf_enforce_token = yes                   ; 保持开启(CVE 加固)
samesite_cookie_setting = Lax
api_calls_per_interval = 10000             ; API 限流:每小时 1 万次
api_failed_login_limit = 4
secret_key = file:///etc/roundup/secret.key ; 密钥不落配置文件
debug = no

[rdbms]
backend = sqlite                           ; >5 万 issue 建议迁 postgresql

[mail]
domain = example.net
host = smtp-relay.internal.example.net
port = 25
charset = utf-8

[nosy]
max_attachment_size = 10485760             ; 附件上限 10MB

配套的 systemd ExecStart(服务层参数,多 worker 场景可用 -t thread 改线程模式):

ExecStart=/opt/roundup-venv/bin/roundup-server -n 0.0.0.0 -p 8080 support=/opt/trackers/support

模板解读:secret_key 与数据库密码均走 file:/// 引用,避免敏感值进配置管理;web 用 HTTPS 域名(前置 Nginx 做 TLS 终结反代到 8080);限流与失败封禁参数按「内网 50 人 + REST 自动化脚本」估的量级,可在 C4 功能验证后按实际调整。

十三、常见问题(FAQ)

Q1:改了 config.ini 不生效?

必须重启服务:systemctl restart roundup-server(配置在进程启动时读取一次)。重启后用 systemctl is-active 确认不是 active 但页面异常的状态。

Q2:切换 template_engine = jinja2 后页面显示模板源码?

jinja2 引擎读不懂 classic 模板自带的 zopetal(TAL)格式 html/ 模板(实测回显见 5.2)。要么改回 zopetal,要么把 templates 指向 jinja2 格式的模板目录(jinja2 模板实例的 html/)。

Q3:关闭 enable_rest 后 REST 返回 404 而非 403?

正常现象:enable_rest = no 是「端点不存在」级别关闭(实测 404),与权限不足(匿名访问返回 403)不同。若只想收权不想关端点,用权限体系(schema.py 里给 Anonymous 去掉 Rest 权限)。

Q4:多实例负载均衡下用户频繁被登出?

各实例 secret_key 不一致导致会话 Cookie 互相验签失败。把同一个密钥文件分发到所有节点并统一 secret_key = file:///etc/roundup/secret.key。

Q5:通知邮件发不出去怎么排查?

先确认 [mail] host 已填且端口可达:curl -v telnet://smtp-host:25 类连通性测试;再开 [mail] debug = yes + systemctl restart,触发一封通知后在 journalctl -u roundup-server 里看 SMTP 会话过程。进站邮件问题则看 roundup-mailgw 的投递日志。

Q6:密码策略太慢/太快?

password_pbkdf2_default_rounds(默认 250000)控制哈希轮数;调整后对新设密码生效,老密码靠 migrate_passwords = yes 在用户下次登录时自动迁移。

十四、参考链接