Gerrit 配置参数详解
以 3.14.4 实测站点为底本逐节详解 etc/gerrit.config(gerrit/container/auth/database/sshd/httpd/sendemail/receive/index/cache/change 等)与 secure.config 密钥体系,含企业内网/大规模站/反代 TLS 三类场景配置示例与配置生效校验、常见配置错误排障。
Gerrit 配置参数详解
目标:以 Gerrit 3.14.4 站点实测生成的
etc/gerrit.config为底本,逐节讲解各配置段(gerrit、container、auth、database、sshd、httpd、sendemail、receive、index、cache、change 等)的参数含义、默认值与生产调整建议,并单独说明etc/secure.config密钥配置与站点目录体系。参数语义以官方 config-gerrit 文档为准(3.14 版,查询日期 2026-10-27),配置文件内容为本环境实测。
一、环境信息
- Gerrit 版本:3.14.4(官方镜像
gerritcodereview/gerrit:3.14.4,站点目录/var/gerrit,自动 init 生成) - 配置文件路径:
/var/gerrit/etc/gerrit.config(主配置)、/var/gerrit/etc/secure.config(密钥配置),宿主 bind mount 于部署目录etc/ - JVM:OpenJDK 21(镜像内置),Gerrit 进程用户
gerrit - 参数语义参考:官方文档 https://gerrit-review.googlesource.com/Documentation/config-gerrit.html(查询日期 2026-10-27)
- 实测环境配套部署篇:《Gerrit 3.14 Docker Compose 部署实战》(发布后可互链),本篇在该站点上直接取材
二、配置文件体系总览
Gerrit 站点目录 /var/gerrit 结构(实测 ls 回显):
bin cache data db etc git
index lib logs plugins static tmp
etc/ 内与配置相关的文件(实测清单):
| 文件 | 角色 | 是否手工维护 |
|---|---|---|
gerrit.config | 主配置:服务、认证、数据库、端口、邮件等全部运行参数 | 是(核心) |
secure.config | 密钥配置:各类口令/私钥,独立于主配置便于权限管控 | 是(敏感项) |
jgit.config | JGit 传输层参数(init 自动生成,一般不动) | 否 |
ssh_host_*_key(.pub) | Gerrit 内置 SSHD 的主机密钥(rsa/ecdsa/ed25519 全套) | 自动生成 |
mail/ | 邮件模板(可覆盖默认模板) | 按需 |
plugins/ | 插件 jar 与插件级配置(如 replication.config) | 按需 |
关键机制:
- 修改即生效方式:除个别段外(如
[plugins]热装载),改gerrit.config后需重启服务生效(部署篇的docker compose restart;裸机为bin/gerrit.sh restart); - 敏感信息分离:口令类写
secure.config([database] password、[ldap] password、[sendemail] smtpPass等,段名与主配置同名对应),文件权限收紧到 600; - 继承体系:项目级配置(
project.config)继承All-Projects,All-Projects又可被gerrit.config的默认值兜底——三层覆盖顺序为:项目配置 > All-Projects > gerrit.config。
实测自动 init 生成的 secure.config 内容:
[auth]
registerEmailPrivateKey = zIz+P9F8yvaqfT1ULS8lEotHfzsc7hJjtz0=
registerEmailPrivateKey 用于邮箱验证链接签名,init 自动生成,勿改勿丢(丢失后历史待验证邮箱链接全部失效)。
三、gerrit.config 逐节详解
以下底本为实测站点的初始 gerrit.config(自动 init 生成,详见部署篇第七节),逐节展开参数表。每节先列实测初始值,再列生产常用可调项。
3.1 [gerrit]:站点全局参数
[gerrit]
basePath = git
canonicalWebUrl = http://localhost:8141
serverId = 4019fa49-0f3f-41c3-b794-5405c7edbb13
| 参数 | 默认/示例 | 说明 |
|---|---|---|
basePath | git | Git 裸仓库根目录,相对站点目录(即 /var/gerrit/git)。建站后不可改,否则所有仓库失联 |
canonicalWebUrl | 必填 | 对外基地址:Change URL、邮件链接、OAuth 回调都以它为根。写错导致页面跳转异常(排障见第七节 7.1) |
serverId | 自动生成 UUID | 站点全局唯一标识(Change-Id 命名空间)。严禁修改/复制——多站点复制配置时如果 serverId 相同会导致 Change 串站 |
allProjects | All-Projects | 全局权限根项目名(权限在此定义、全站继承) |
allUsers | All-Users | 全局用户数据项目(账户/偏好/外部 ID 存储于此仓库) |
reportBugUrl | 官方 issues | 页面「Report Bug」链接目标,企业内网可指向自有工单系统 |
defaultTheme | — | 3.14 WebUI 现代化改造后的默认主题控制项(light/dark) |
生产要点:canonicalWebUrl 必须与用户实际访问地址(含反代后的域名/端口)一致;多站点/灾备复制场景 serverId 保持主站原值。
3.2 [container]:进程与 JVM
[container]
javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
user = gerrit
javaHome = /usr/lib/jvm/java-21-openjdk-21.0.12.1.1-1.2.el9.alma.1.x86_64
javaOptions = -Djava.security.egd=file:/dev/./urandom
javaOptions = --add-opens java.base/java.net=ALL-UNNAMED
javaOptions = --add-opens java.base/java.lang.invoke=ALL-UNNAMED
| 参数 | 说明 |
|---|---|
user | 服务进程运行用户(官方镜像内为 gerrit,uid 1000) |
javaHome | JVM 路径(init 自动探测;3.12 起要求 Java 21+,3.15 将引入 Java 25) |
javaOptions | JVM 参数,可多行叠加。堆限制写法:javaOptions = -Xms256m -Xmx512m(实测验证生效,回显见部署篇第七节) |
heapPath | 诊断堆转储文件路径,OOM 排障时配置 |
注意:官方镜像的 JAVA_OPTS 环境变量会被入口脚本覆盖(部署篇 13.2 排障实录),JVM 参数只认这里。
3.3 [auth]:认证体系
[auth]
type = OPENID
type 全枚举(3.14 官方文档):
| 值 | 形态 | 适用 |
|---|---|---|
OPENID | 公网 OpenID 联合登录(自动 init 默认) | 公网开放社区 |
OPENID_SSO | OpenID 单点(自动跳转固定 IdP) | 已有 OpenID SSO |
LDAP / LDAP_BIND | LDAP 目录认证(BIND 校验两种方式) | 企业目录,最常见 |
HTTP / HTTP_LDAP | 反代层认证(REMOTE_USER 头) / 反代+LDAP 组合 | 反代网关形态(部署篇 11.2 实测) |
OAUTH / GITHUB | OAuth2 IdP(google/github 等插件承载) | 云上 SSO |
CUSTOM_EXTENSION | 自定义(配 loginUrl/logoutUrl) | 私有 SSO 对接 |
DEVELOPMENT_BECOME_ANY_ACCOUNT | 开发者模式(页面切换任意账户) | 仅内网体验(部署篇 11.1 实测建户流程) |
其他常用参数:
| 参数 | 默认 | 说明 |
|---|---|---|
autoCreateAccount | false(LDAP 模式默认开) | 首次登录自动建户 |
contributorAgreements | false | 是否启用贡献者协议(CLA)流程 |
userNameCaseInsensitive | — | 用户名大小写不敏感(3.5 引入,混合目录环境建议开) |
loginUrl / logoutUrl | — | CUSTOM_EXTENSION 模式的登录/登出跳转地址 |
相关凭据:HTTP 模式下账户密码走 REST /accounts/<user>/password.http 设置(部署篇实测),3.13 起 HTTP 密码机制逐步废弃、转向 token,新建站点优先考虑 token 方案。
3.4 [database]:元数据库
H2 默认形态(自动 init 不写 [database] 段,全部走默认值:站点目录 db/ 下 H2 文件库)。显式配置示例:
[database]
type = postgresql
hostname = db
database = reviewdb
username = gerrit
| 参数 | 默认 | 说明 |
|---|---|---|
type | h2 | 可选 postgresql / mysql / mariadb(NoteDb 后关系库只存账户/群组,体量小) |
hostname / port | 本地 / 各库默认端口 | PostgreSQL 5432、MySQL 3306 |
database | reviewdb | 库名(生产按团队规范命名) |
username / password | — | 账户口令,password 必须写 secure.config |
poolLimit | 8 | 连接池上限,多实例共享库时按实例数调 |
poolMaxIdle | poolLimit | 池内最大空闲连接 |
H2 专属:3.12 起 H2 升级 v2 后端,3.10 引入可配置的 H2 缓存裁剪。切换数据库属站点级决策(无在线迁移),新站直接选定(部署篇第十节给过 PostgreSQL 完整三步)。
3.5 [sshd]:SSH 服务(Git 推拉 + 命令面)
[sshd]
listenAddress = *:29418
| 参数 | 默认 | 说明 |
|---|---|---|
listenAddress | *:29418 | SSH 监听地址端口;多网卡绑定内网口写 192.0.2.10:29418;宿主端口映射与它解耦(部署篇把 29418 映射到 8148) |
threads | 与 CPU 相关 | SSHD 工作线程数,推拉并发大的站点调高 |
maxConnections | threads × 3 | 最大并发连接,网关侧需同步放行 |
idleTimeout | — | 空闲连接回收秒数,防长挂连接占池 |
advertisedAddress | — | 对外通告地址(NAT/双栈环境保证 clone URL 正确) |
主机密钥自动生成于 etc/ssh_host_*(实测含 rsa/ecdsa/ed25519 三族),换机器迁移站点时必须带走,否则全部客户端报 host key 变更告警。
3.6 [httpd]:HTTP 服务(Web UI + REST API)
[httpd]
listenUrl = http://*:8080/
| 参数 | 默认 | 说明 |
|---|---|---|
listenUrl | http://*:8080/ | 四种形态:http://(裸 HTTP)、https://(内置 TLS,需配证书)、proxy-http://(反代明文)、proxy-https://(反代 TLS 卸载)。反代场景建议 proxy-http://*:8080/ 并让 Gerrit 感知代理存在 |
requestLog | — | 置 true 启用独立请求日志(logs/httpd_log),排障/审计开 |
gracefulStopTimeout | — | 停机宽限秒数(滚动升级场景) |
与本篇部署形态对应:listenUrl 保持 http://*:8080/,TLS 与 Basic 认证由 nginx 网关层承担(部署篇 4.4)。
3.7 [sendemail]:邮件通知
[sendemail]
smtpServer = localhost
| 参数 | 默认 | 说明 |
|---|---|---|
smtpServer | localhost | SMTP 服务器地址。默认 localhost 在没有本机 MTA 时邮件必失败(排障 7.4),生产必须指向真实 SMTP |
smtpServerPort | 25(smtpEncryption=ssl 时 465) | SMTP 端口 |
smtpEncryption | none | ssl / starttls 二选一 |
smtpUser / smtpPass | — | SMTP 认证,smtpPass 写 secure.config |
from | SERVER | 发件人策略:SERVER(服务自身)/ USER(评审者本人,易被拒信)/ 混合 MIXED |
includeDiff | — | 邮件正文附 diff 摘要 |
评审通知邮件是团队感知 Gerrit 的第一界面,上线前务必用真实 SMTP 联调(表单触发:评审打分 → 收件人收到 Change-URL 邮件)。
3.8 [receive]:推送接收策略
[receive]
enableSignedPush = false
| 参数 | 默认 | 说明 |
|---|---|---|
enableSignedPush | false | 接受 GPG 签名推送(配合 Web of Trust 校验提交者身份) |
maxObjectSizeLimit | 项目级可覆盖 | 全站单推送对象大小上限(如 100 m),防误推大二进制 |
checkReceivedObjects | 项目级 | 收包完整性严格校验开关 |
3.9 [index]:二级索引
[index]
type = lucene
| 参数 | 默认 | 说明 |
|---|---|---|
type | lucene | 大规模站点换 elasticsearch(配 [elasticsearch] 段) |
changes.open / changes.close | Lucene 分片参数 | 索引分片策略,超大站点调优项 |
reindexAfterRefUpdate | true | 引用变更后异步重建受影响索引(关闭可省 CPU 但查询滞后) |
索引可随时全量重建:java -jar gerrit.war reindex -d /var/gerrit(镜像内入口脚本每次启动自动跑)。index 目录整体可删(重启自动重建),升级版本后如遇查询异常先 reindex 再排查。
3.10 [cache]:运行缓存
[cache]
directory = cache
内置缓存族(实测 gerrit show-caches 回显的条目即来自这些定义,见部署篇第十三节):
| 缓存名 | 内容 |
|---|---|
change_notes | NoteDb 变更元数据解析结果(命中率高,热路径) |
changeid_project | Change-Id → 项目定位 |
external_ids_map | 外部身份映射(登录查询) |
groups | 群组成员关系 |
adv_bases | diff 基准选择 |
default_preferences | 全站默认偏好 |
调优写法(内存权重模式):
[cache "change_notes"]
memoryLimit = 1024
directory 持久化缓存目录可整体清空(重启自动重建),排障常用手段。
3.11 [change]:评审行为
| 参数 | 默认 | 说明 |
|---|---|---|
submitWholeTopic | false | 同 topic 的关联 Change 整体提交(跨仓库特性链场景开) |
privateByDefault | — | 新建 Change 默认私隐模式 |
disablePrivateChanges | false | 全站禁用私隐 Change |
largeChange | 500 行 | 超大 Change 阈值(UI 标记 + 评审提示) |
3.12 [user]:匿名显示
[user]
anonymousCoward = Anonymous Coward
anonymousCoward:未登录用户的展示名(内核社区梗),企业内网一般不改。
3.13 [plugins]:插件装载
| 参数 | 说明 |
|---|---|
loadDelay | 启动后延迟装载秒数(加快冷启动) |
replication.<...> 等 | 插件级参数多数在插件自己的配置文件(如 etc/replication.config)里维护 |
本站实测默认装载的官方插件(init 日志):gitiles、hooks、plugin-manager、replication、reviewnotes、singleusergroup、uploadvalidator、webhooks、delete-project。
四、secure.config 详解
secure.config 与 gerrit.config 段结构同构,专放口令/私钥。常用键位:
[database]
password = <DB 口令>
[ldap]
password = <LDAP bind 口令>
[sendemail]
smtpPass = <SMTP 口令>
实测站点当前内容仅有 init 自动生成的邮箱签名私钥:
[auth]
registerEmailPrivateKey = zIz+P9F8yvaqfT1ULS8lEotHfzsc7hJjtz0=
管理规范:
- 权限收紧
chmod 600 etc/secure.config(bind mount 到宿主后在宿主侧执行); - 口令轮换只改此文件 + 重启,主配置不动;
- 备份策略与
gerrit.config同级但渠道隔离(口令不进代码库、不进通用配置仓库)。
五、典型场景配置示例
5.1 企业内网标准站(PostgreSQL + LDAP + SMTP)
[gerrit]
canonicalWebUrl = https://gerrit.example.com
[auth]
type = LDAP
[ldap]
server = ldap://ldap.example.com
accountBase = ou=people,dc=example,dc=com
accountPattern = (&(objectClass=person)(uid=${username}))
groupBase = ou=groups,dc=example,dc=com
[database]
type = postgresql
hostname = pg.internal
database = reviewdb
username = gerrit
[sendemail]
smtpServer = smtp.example.com
smtpEncryption = starttls
smtpUser = gerrit@example.com
from = SERVER
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = proxy-http://*:8080/
配套 secure.config:
[database]
password = xxxxxxxx
[ldap]
password = xxxxxxxx
[sendemail]
smtpPass = xxxxxxxx
5.2 大规模站点(ES 索引 + JVM 调优)
[index]
type = elasticsearch
[elasticsearch]
hostname = es.internal
port = 9200
[container]
javaOptions = -Xms4g -Xmx4g
javaOptions = -XX:+UseG1GC
5.3 反代 TLS 卸载(httpd 感知代理)
[httpd]
listenUrl = proxy-http://*:8080/
配合 nginx proxy_set_header X-Forwarded-Proto $scheme;,Gerrit 生成链接自动带 https(部署篇 4.4 的网关配置已含该头)。
六、配置生效与校验
- 语法校验:启动日志是第一校验器——配置段名/键名写错时启动即报
FATAL(如未知段落直接拒绝启动),改配置后docker logs gerrit-3.14.4-app观察到Gerrit Code Review 3.14.4 ready即合法且生效; - REST 读取验证:运行时配置片段可通过 REST 校验:
curl -s -u admin:q1w2e3r4 http://localhost:8141/config/server/version
curl -s -u admin:q1w2e3r4 http://localhost:8141/config/server/info | head -5
实测回显:
)]}'
"3.14.4"
)]}'
{"gerrit":{"all_projects":"All-Projects","all_users":"All-Users",...}}
- SSH 面验证:
gerrit show-caches(部署篇回显)输出的 uptime 行可确认当前进程是否已带新配置重启; - 回滚:改坏配置导致起不来时,直接回滚
etc/gerrit.config后重启即可(配置与数据分离,改配置本身不破坏站点数据)。
七、常见配置错误(排障实录)
7.1 canonicalWebUrl 写错导致页面/链接异常
现象:页面能开,但点 Change 通知邮件链接 404,或登录后重定向回错误端口。根因:canonicalWebUrl 与实际访问地址不一致(实测环境 init 按 CANONICAL_WEB_URL=http://localhost:8141 生成,改对外域名后未同步此项)。解决:canonicalWebUrl 改为用户真实访问地址后重启。
7.2 JAVA_OPTS 环境变量不生效
现象:Compose 里设 JAVA_OPTS=-Xmx512m,进程实际未按此运行。根因:镜像入口脚本覆盖了该变量(部署篇 13.2 实录)。解决:堆参数写入 [container] javaOptions,验证方式见部署篇第七节(-Xms256m -Xmx512m 回显)。
7.3 [sshd] 端口冲突启动失败
现象:BindException: Address already in use。根因:29418 在宿主侧已被占用(本环境实测:同宿主并行组件已占 29418)。解决:保持 Gerrit 内部 listenAddress = *:29418 不动,在编排层把宿主侧映射换到空闲端口(部署篇 4.3 映射 8148 的口径)。
7.4 sendemail 指向 localhost 但无本机 MTA
现象:评审操作正常,邮件收不到;日志出现 MailException / 连接拒绝。根因:smtpServer = localhost 是 init 默认值,站点没有本机 SMTP。解决:指向真实 SMTP 并配齐 smtpEncryption/smtpUser(口令进 secure.config)。
7.5 auth.type 改错值启动 FATAL
现象:[auth] type = http(小写/拼写错)后启动报非法枚举。根因:type 值是枚举常量,大小写敏感。解决:按 3.3 节枚举表写标准值(HTTP、LDAP、DEVELOPMENT_BECOME_ANY_ACCOUNT…)。
八、参考链接
- config-gerrit 官方参数文档(3.14):https://gerrit-review.googlesource.com/Documentation/config-gerrit.html
- 认证配置:https://gerrit-review.googlesource.com/Documentation/config-authentication.html
- 反向代理配置:https://gerrit-review.googlesource.com/Documentation/config-reverseproxy.html
- 数据库配置:https://gerrit-review.googlesource.com/Documentation/config-database.html
- 站内《Gerrit 3.14 Docker Compose 部署实战》:https://www.quzuo.net/document/ypUmjOG83Lt8
- 站内《Gerrit 介绍与选型指南》:https://www.quzuo.net/document/jBzSHXoP3n0J