Tolgee 命令与运维:启动参数、PAT API、备份与升级
Tolgee v3.241.1 运维实战:systemd 日常管理、命令行启动参数、PAT 令牌与项目/翻译 CRUD、pg_dump 与文件存储备份、替换 jar 升级闭环与故障速查。
Tolgee 命令与运维:启动参数、PAT API、备份与升级
本篇为运维篇,前置阅读:Tolgee 单机安装实战:Ubuntu 22.04 + OpenJDK 25 + jar + systemd 与 Tolgee 配置详解:application.properties 与环境变量逐项生效验证。
一、日常服务管理与启动参数
1.1 systemd 日常命令
承接安装篇的 tolgee.service,日常运维命令与实测回显(2026-10-28,v3.241.1):
systemctl start|stop|restart|status tolgee
systemctl is-active tolgee && systemctl is-enabled tolgee
journalctl -u tolgee -n 200 --no-pager
journalctl -u tolgee -f
实测 systemctl status tolgee --no-pager 关键回显:
● tolgee.service - Tolgee Translation Platform
Loaded: loaded (/etc/systemd/system/tolgee.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-10-28 02:18:14 UTC; 10s ago
Main PID: 7704 (java)
Tasks: 30 (limit: 2932)
Memory: 599.0M
启动到可服务约需 30–40 秒(含 Liquibase 库结构校验),脚本化重启后请轮询端口而非盲等:
for i in $(seq 1 30); do curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/ | grep -q 200 && break; sleep 2; done
运行时 JVM 参数核查(运维红线:堆改动必须验证):
/usr/lib/jvm/java-25-openjdk-amd64/bin/jps -v | grep tolgee | tr ' ' '\n' | grep -E '^-Xms|^-Xmx'
实测回显:
-Xms256m
-Xmx512m
1.2 命令行启动参数实测
除了配置文件与环境变量,Tolgee 支持标准 Spring Boot 命令行参数(--键=值,优先级最高)。实测临时用 8090 端口启动:
java -Xms256m -Xmx512m -jar tolgee-3.241.1.jar \
--server.port=8090 \
--spring.datasource.url=jdbc:postgresql://localhost:5432/tolgee \
--spring.datasource.username=postgres \
--spring.datasource.password=q1w2e3r4 \
--tolgee.postgres-autostart.enabled=false \
--tolgee.authentication.jwt-secret=tolgee-lab-jwt-secret-2026-0123456789abcdef
实测日志回显:
2026-10-28T02:28:58.512Z INFO 8714 --- [main] o.s.boot.tomcat.TomcatWebServer : Tomcat started on port 8090 (http) with context path '/'
命令行参数真实压过了配置里的端口。典型用途:临时端口拉起第二个实例做数据核对、临时关闭遥测、一次性调整认证参数等。注意同一机器跑两个实例要共用 PostgreSQL 时,确认连接池与负载可承受。
二、PAT 令牌与 REST API 实操
2.1 创建个人访问令牌(PAT)
PAT(Personal Access Token)是绑定到个人账号的 API 令牌,适合脚本与 CI。先用管理员账号换 JWT,再建 PAT(实测):
TOKEN=$(curl -s -X POST http://localhost:8080/api/public/generatetoken \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"q1w2e3r4"}' | python3 -c 'import json,sys; print(json.load(sys.stdin)["accessToken"])')
curl -s -X POST http://localhost:8080/v2/pats \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"description":"ops-lab-pat","expiresAt":1824681600000}'
实测回显:
{"token":"tgpat_1l4okgb65ge8sebh3fc52cnfpbdgb4vdfdme60tcsmjgtmi56ula","createdAt":1793154277997,"description":"ops-lab-pat","expiresAt":1824681600000,"id":1000011001,"lastUsedAt":null,"updatedAt":1793154277997}
两个实测踩坑:
expiresAt是 epoch 毫秒时间戳,传"2027-10-28"这类日期字符串会报Cannot deserialize value of type 'java.lang.Long'(400);- PAT 的管理端点在
/v2/pats(列表 GET、删除 DELETE/v2/pats/{id}、重签 PUT/v2/pats/{id}/regenerate),自查用GET /v2/pats/current。
2.2 PAT 的认证方式:X-API-Key 头(实测)
PAT 必须放 X-API-Key 请求头,不能放 Authorization,实测对比:
PAT='tgpat_1l4okgb65ge8sebh3fc52cnfpbdgb4vdfdme60tcsmjgtmi56ula'
curl -s -o /dev/null -w 'X-API-Key: %{http_code}\n' http://localhost:8080/v2/projects -H "X-API-Key: $PAT"
curl -s -o /dev/null -w 'Bearer: %{http_code}\n' http://localhost:8080/v2/projects -H "Authorization: Bearer $PAT"
实测回显:
X-API-Key: 200
Bearer: 401
GET /v2/pats/current 用 PAT 自查身份与有效期,实测回显含 "lastUsedAt":1793154331847(平台会记录最近使用时间,可用于审计僵尸令牌)。另外注意 PAT 权限有边界:实测用 PAT 调组织头像接口返回 {"code":"api_access_forbidden"},文件类/管理类操作仍需 JWT 或在界面完成。
2.3 项目与翻译 CRUD 实测链路
建项目(实测:必须带 organizationId;语言对象的 name 与 originalName 都不能为空,缺一个都是 400 校验错误):
curl -s -X POST http://localhost:8080/v2/projects \
-H "X-API-Key: $PAT" -H 'Content-Type: application/json' \
-d '{"name":"demo-web","organizationId":1,"languages":[{"tag":"en","name":"English","originalName":"English"},{"tag":"zh","name":"简体中文","originalName":"简体中文"}]}'
实测回显(节选):{"id": 2, "name": "demo-web", ...}(200)。组织 id 自查:GET /v2/user/single-owned-organizations。
建翻译键(一次带上 en/zh 两个语言译文):
curl -s -X POST http://localhost:8080/v2/projects/2/keys \
-H "X-API-Key: $PAT" -H 'Content-Type: application/json' \
-d '{"name":"login.title","translations":{"en":"Welcome back","zh":"欢迎回来"}}'
实测回显(节选):
{"id":1000017001,"name":"login.title",...,"translations":{"en":{"id":1000018001,"text":"Welcome back","state":"TRANSLATED",...},"zh":{"id":1000018002,"text":"欢迎回来","state":"TRANSLATED",...}}}
读回与改键名:
curl -s 'http://localhost:8080/v2/projects/2/translations/en' -H "X-API-Key: $PAT"
# 实测回显:{"en":{"login":{"title":"Welcome back"}}}
curl -s -X PUT 'http://localhost:8080/v2/projects/2/keys/1000017001' \
-H "X-API-Key: $PAT" -H 'Content-Type: application/json' \
-d '{"name":"login.title.renamed"}' -o /dev/null -w '%{http_code}\n'
# 实测回显:200
导出译文(CI 拉取译文用;注意导出是 POST 且返回 zip,GET /v2/projects/2/export/json?zip=false 这类直观路径会被前端路由接管返回 HTML 页面):
curl -s -X POST 'http://localhost:8080/v2/projects/2/export' \
-H "X-API-Key: $PAT" -H 'Content-Type: application/json' \
-d '{"format":"JSON","filterState":["TRANSLATED"]}' -o /tmp/export.bin
python3 -c "import zipfile; print(zipfile.ZipFile('/tmp/export.bin').namelist())"
实测回显:
zip entries: ['en.json', 'zh.json']
三、备份与恢复
3.1 备份什么
Tolgee 的全部状态 = PostgreSQL 数据库(项目、键值、翻译、用户、活动记录)+ 文件存储目录(TOLGEE_FILE_STORAGE_FS_DATA_PATH 指向的目录,含头像与截图)+ 配置文件(/etc/default/tolgee 与 tolgee.service)。三者齐备才能完整重建。
3.2 备份实测
mkdir -p /opt/backup
su postgres -c 'pg_dump -d tolgee -Fc' > /opt/backup/tolgee-db-20261028.dump
tar czf /opt/backup/tolgee-filestorage-20261028.tar.gz -C /opt/tolgee file-storage
ls -lh /opt/backup/
su postgres -c 'pg_restore --list /opt/backup/tolgee-db-20261028.dump' | grep -cE 'TABLE DATA|SEQUENCE'
实测回显:
total 348K
-rw-r--r-- 1 root root 343K Oct 28 02:28 tolgee-db-20261028.dump
-rw-r--r-- 1 root root 532 Oct 28 02:28 tolgee-filestorage-20261028.tar.gz
150
pg_dump 自定义格式(-Fc)支持并发恢复与选择性恢复;pg_restore --list 校验转储可读(实测 150 个对象条目)。生产环境把上述两行加进 cron(建议每日一次,保留 ≥14 天)并将产物异机存放。
3.3 恢复流程(命令 + 预期结果)
以下为标准恢复流程:
pg_restore --list已实测可用,整库恢复动作遵循 pg_restore 标准语义,生产执行前务必先在测试库演练。
systemctl stop tolgee
su postgres -c "dropdb tolgee && createdb tolgee"
su postgres -c "pg_restore -d tolgee /opt/backup/tolgee-db-20261028.dump"
tar xzf /opt/backup/tolgee-filestorage-20261028.tar.gz -C /opt/tolgee
systemctl start tolgee
# 预期:日志出现 Tomcat started on port 8080,登录接口返回 200,译文与头像完整
四、升级:替换 jar 实测闭环
4.1 升级原理
Tolgee 升级 = 替换 jar 文件 + 重启。数据库结构由新版内置 Liquibase 在启动时自动增量迁移(实测启动日志多次出现 Database is up to date, no changesets to execute),配置(环境变量/properties)与数据均不动。升级前必须完成 3.2 节备份。
4.2 实测:替换 jar 全流程
在实测环境用 v3.241.1(当前版)与 v3.240.3(上一维护版,2026-10-26 发布,SHA-256 b5c5b3cec1f3cb5a7344ad247cb871e8b572620351923246364fd0e03c975983)做了双向替换验证:
# 1) 停服务、备份旧 jar
systemctl stop tolgee
cp /opt/tolgee/tolgee-3.241.1.jar /opt/backup/tolgee-3.241.1.jar.bak
# 2) 放入新 jar,把 tolgee.service 的 ExecStart 指向新文件
mv tolgee-3.240.3.jar /opt/tolgee/
sed -i 's|tolgee-3.241.1.jar|tolgee-3.240.3.jar|' /etc/systemd/system/tolgee.service
systemctl daemon-reload && systemctl start tolgee && sleep 40
# 3) 验证版本号与数据完整性
curl -s http://localhost:8080/api/public/configuration | python3 -c 'import json,sys; print("version:", json.load(sys.stdin)["version"])'
替换后实测回显:
version: v3.240.3
随后改回 tolgee-3.241.1.jar 重启,实测回显 version: v3.241.1,且登录接口 200、替换前建的翻译键数据原样保留(GET /v2/projects/2/translations/en 仍返回改名后的键与译文)。版本回显字段 version 来自 /api/public/configuration,是升级验收的标准探针。
4.3 升级注意
- 不建议降级:相邻维护版(v3.240.3 ↔ v3.241.1)实测可双向切换且库结构兼容,但跨多个小版本的"升级后回退"存在 Liquibase 已前滚变更无法安全回滚的风险,唯一安全回退手段是 3.3 节的整库恢复;
- 发版节奏快:半月 20 版(2026-10 实况),建议锁定季度节奏升级,升级前读 Release Notes 关注 breaking 标记;
- JDK 要求随版本走:当前版本线要求 Java 25(class file 69.0),升级到未来版本时先查 Release Notes 的 Java 最低要求,避免启动报
UnsupportedClassVersionError。
五、故障排查速查
5.1 状态一页表
| 症状 | 首查命令 | 实测经验 |
|---|---|---|
| 服务反复重启 | journalctl -u tolgee -n 200 --no-pager | 大多是数据库连不上或配置校验失败(如 jwt-secret 过短) |
| 启动慢 | 看 Liquibase 行 | 首次建库或大版本迁移需数分钟,等 Database is up to date |
| 接口 403 | 确认令牌类型 | PAT 走 X-API-Key,JWT 走 Authorization: Bearer;登录只能 POST /api/public/generatetoken |
| 界面 502/超时 | systemctl is-active tolgee + ss -ltn | grep 8080 | 进程活着但端口没起 = 还在启动中;等就绪再查前置代理 |
| 内存增长 | jps -v 核对堆参 + jstat -gc <pid> | 堆上限 512 MB 起步,按活跃翻译量与并发调整 |
5.2 一键体检脚本(命令 + 预期结果)
已在实测环境验证各单项命令;脚本为串联封装,标注意为预期结果。
#!/bin/bash
echo -n "service: "; systemctl is-active tolgee
echo -n "port: "; curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/
echo -n "login: "; curl -s -X POST http://localhost:8080/api/public/generatetoken \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"q1w2e3r4"}' -o /dev/null -w '%{http_code}\n'
echo -n "version: "; curl -s http://localhost:8080/api/public/configuration | grep -o '"version": "[^"]*"'
echo -n "jvm: "; /usr/lib/jvm/java-25-openjdk-amd64/bin/jps -v | grep -c tolgee
预期五项输出依次为 active、200、200、当前版本号、1。任一项异常再按 5.1 定位。
回顾全系列:选型认知见 Tolgee 是什么:自托管国际化翻译管理平台的认知与选型,安装见 Tolgee 单机安装实战:Ubuntu 22.04 + OpenJDK 25 + jar + systemd,配置见 Tolgee 配置详解:application.properties 与环境变量逐项生效验证。