Tryton 8.2 Docker Compose 部署指南
用 Docker Compose 编排官方镜像 tryton/tryton:8.2 + postgres:16-alpine,含健康检查依赖、TRYTOND_DATABASE_NAMES 关键配置、数据库初始化、模块激活与 JSON-RPC 登录验证。
Tryton 8.2 Docker Compose 部署指南
目标:用 Docker Compose 一键编排 Tryton 8.2 服务端(官方镜像 tryton/tryton:8.2)+ PostgreSQL 16,完成数据库初始化、业务模块激活与 JSON-RPC 登录验证。已在 Docker 29.9.2 + Docker Compose v5.6.1 环境实测通过。
一、环境信息
- Docker:29.9.2
- Docker Compose:v5.6.1(插件形态,
docker compose子命令) - Tryton 镜像:
tryton/tryton:8.2(官方镜像,内置 trytond 8.2.1 + gunicorn 23.0.0,镜像体积 959MB) - 数据库镜像:
postgres:16-alpine(420MB) - 业务数据库:
trytondb;库账号tryton/q1w2e3r4 - 演示账号:
admin/q1w2e3r4 - 宿主映射端口:8135 → 容器 8000
二、前置条件
- 已安装 Docker 与 Docker Compose 插件:
docker version --format '{{.Server.Version}}'
docker compose version
实测输出:
29.9.2
Docker Compose version v5.6.1
- 宿主 8135 端口未被占用:
ss -ltn | grep :8135 || echo "port 8135 is free"
预期输出:
port 8135 is free
三、镜像选型说明
Tryton 官方在 Docker Hub 维护 tryton/tryton 镜像,标签与系列号对应。截至 2026-10-25 的主要标签:
| 标签 | 说明 | 适用 |
|---|---|---|
8.2 / latest | 当前稳定系列(2026-10-06 发布,2026-10-23 更新) | 本文选择,功能最新 |
8.0 | LTS 系列,5 年支持期 | 求稳的生产环境 |
7.8 等 | 旧系列 | 仅存量维护 |
数据库侧官方镜像没有绑定版本,Tryton 8.2 支持 PostgreSQL 12+,本文选 postgres:16-alpine( Alpine 变体体积小 4 倍以上,功能与 Debian 版一致)。
四、Compose 编排文件
创建部署目录并写入 docker-compose.yml:
mkdir -p /opt/tryton-compose && cd /opt/tryton-compose
name: tryton-8-2-stack
services:
postgres:
image: postgres:16-alpine
container_name: tryton-8-2-postgres
hostname: db
restart: unless-stopped
environment:
POSTGRES_DB: trytondb
POSTGRES_USER: tryton
POSTGRES_PASSWORD: q1w2e3r4
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U tryton -d trytondb"]
interval: 5s
timeout: 3s
retries: 20
networks:
- tryton-net
tryton:
image: tryton/tryton:8.2
container_name: tryton-8-2-server
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
TRYTOND_DATABASE__URI: postgresql://tryton:q1w2e3r4@db:5432/trytondb
TRYTOND_WEB__LISTEN: 0.0.0.0:8000
TRYTOND_DATABASE_NAMES: trytondb
ports:
- "8135:8000"
networks:
- tryton-net
volumes:
pgdata:
networks:
tryton-net:
driver: bridge
逐项说明关键设计:
| 配置项 | 作用 | 说明 |
|---|---|---|
name: tryton-8-2-stack | 项目名 | 显式命名,卷与网络前缀可控 |
hostname: db | 数据库主机名 | tryton 服务用 db 解析数据库,与服务名解耦 |
healthcheck + depends_on: service_healthy | 启动顺序 | 等 PostgreSQL 真正可连后才启动 tryton,避免首启连库失败 |
TRYTOND_DATABASE__URI | 数据库连接串 | trytond 环境变量注入格式 TRYTOND_<节>__<键>,对应配置文件 [database] uri |
TRYTOND_WEB__LISTEN | 监听地址 | 容器内必须监听 0.0.0.0,否则宿主端口映射拿不到流量 |
TRYTOND_DATABASE_NAMES | 预初始化数据库池 | 不可省略,官方镜像用 gunicorn 托管 WSGI,缺了它登录会 500(排障见 FAQ Q1) |
pgdata 卷 | 数据持久化 | PostgreSQL 数据落命名卷,容器重建不丢数据 |
"8135:8000" | 端口映射 | 宿主 8135 → 容器 8000 |
💡 技术拓展:trytond 配置注入有两种环境变量写法——
TRYTOND_DATABASE_URI(单下划线,整体连接串,官方镜像 entrypoint 也认这个)与TRYTOND_DATABASE__URI(双下划线,按配置节注入)。两者效果相同;本文用双下划线写法,因为它与 trytond.conf 的节结构一一对应,注入任意配置项都通用。
五、启动编排栈
拉取镜像:
cd /opt/tryton-compose
docker compose pull
实测输出:
Image tryton/tryton:8.2 Pulling
Image postgres:16-alpine Pulling
Image postgres:16-alpine Pulled
Image tryton/tryton:8.2 Pulled
启动:
docker compose up -d
实测输出:
Container tryton-8-2-postgres Running
Container tryton-8-2-postgres Waiting
Container tryton-8-2-postgres Healthy
Container tryton-8-2-server Starting
Container tryton-8-2-server Started
确认两个容器状态:
docker compose ps --format '{{.Name}}\t{{.Status}}\t{{.Ports}}'
实测输出:
tryton-8-2-postgres Up 35 minutes (healthy) 5432/tcp
tryton-8-2-server Up 8 seconds 0.0.0.0:8135->8000/tcp, [::]:8135->8000/tcp
查看 tryton 服务启动日志:
docker compose logs tryton | tail -4
实测输出:
tryton-8-2-server | [2026-10-25 02:35:46 +0000] [1] [INFO] Starting gunicorn 23.0.0
tryton-8-2-server | [2026-10-25 02:35:46 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
tryton-8-2-server | [2026-10-25 02:35:46 +0000] [1] [INFO] Using worker: sync
tryton-8-2-server | [2026-10-25 02:35:46 +0000] [9] [INFO] Booting worker with pid: 9
gunicorn 已在容器 8000 端口监听。此时服务进程虽已就绪,但数据库还是空壳,必须执行下一步初始化。
六、初始化数据库与激活模块
官方镜像内置全部 200+ 个业务模块代码,但数据库需要手动初始化。在编排栈所在目录执行:
docker compose run --rm -T tryton bash -c "printf 'q1w2e3r4\nq1w2e3r4\n' | trytond-admin -d trytondb --all --email admin@quzuo.net -p"
docker compose run --rm:用 tryton 服务的同等镜像与环境变量起一个一次性容器执行命令,结束自动删除;-T:禁用伪终端,让 stdin 管道可用;--all:初始化全部框架表;--email预设 admin 邮箱;-p从 stdin 读两行密码。
实测输出:
Warning: Password input may be echoed.
password for "admin" of "trytondb":
Warning: Password input may be echoed.
password confirmation for "admin":
激活常用业务模块(party/product/account/sale 及其依赖链):
docker compose run --rm -T tryton trytond-admin -d trytondb -u party company currency country product account account_product account_invoice account_invoice_stock stock sale --activate-dependencies
验证模块状态(在 postgres 容器内查询):
docker exec tryton-8-2-postgres psql -U tryton -d trytondb -c "SELECT name, state FROM ir_module WHERE state='activated' ORDER BY name;"
实测输出:
name | state
-----------------------+-----------
account | activated
account_invoice | activated
account_invoice_stock | activated
account_product | activated
company | activated
country | activated
currency | activated
ir | activated
party | activated
product | activated
res | activated
sale | activated
stock | activated
(13 rows)
13 个模块全部 activated,初始化完成。
七、验证服务可用
从宿主机直接验证(端口 8135)。trytond 业务调用走 JSON-RPC:公共方法路径 /rpc/,库级方法路径 /<数据库名>/rpc/。
验证服务版本:
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"common.server.version","params":[],"id":1}' \
http://localhost:8135/rpc/
实测输出:
"8.2"
验证数据库已注册:
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"common.db.list","params":[],"id":1}' \
http://localhost:8135/rpc/
实测输出:
["trytondb"]
验证 admin 登录:
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"common.db.login","params":["admin",{"password":"q1w2e3r4"}],"id":1}' \
http://localhost:8135/trytondb/rpc/
实测输出:
[3,"b2106bb96b26f46edec5203b2a7680408ee89e3b7bfc40723115e834a2627bdc",null]
返回 [用户ID, 会话token, ...] 即登录成功。三个接口全部通过,编排栈可用。桌面客户端连接 宿主IP:8135、数据库 trytondb、账号 admin / q1w2e3r4。
八、日常运维操作
查看实时日志:
docker compose logs -f tryton
重启 tryton 服务:
docker compose restart tryton
进入 tryton 容器排障:
docker compose exec tryton bash
备份数据库(pg_dump 输出重定向到宿主文件):
docker exec tryton-8-2-postgres pg_dump -U tryton -Fc trytondb > /opt/tryton-compose/trytondb-$(date +%F).dump
升级镜像(改 compose 文件中的标签后):
docker compose pull
docker compose up -d
docker compose run --rm -T tryton trytond-admin -d trytondb --all
trytond-admin --all 让数据库 schema 跟随新代码迁移,是 Tryton 升级的标准动作。
九、常见问题
Q1:登录接口返回 500,页面显示 'res.user'?
实测现象:compose 文件只配了 TRYTOND_DATABASE__URI 时,common.db.login 返回:
HTTP/1.1 500 INTERNAL SERVER ERROR
Content-Type: text/html; charset=utf-8
<h1>Internal Server Error</h1>
<p>'res.user'</p>
根因:trytond 的模型连接池(Pool)是惰性初始化的。官方镜像用 gunicorn 托管 WSGI 应用,启动时若不知道要服务哪个数据库,Pool 里就没有加载 res.user 等模型,首个登录请求直接抛 KeyError: 'res.user'。
解决:compose 文件中设置 TRYTOND_DATABASE_NAMES: trytondb(本文第四节已包含),trytond 的 WSGI 入口会在 worker 启动时预初始化该库的连接池。加好后 docker compose up -d 重建服务即可。命令行方式(非 gunicorn)启动时的等价参数是 trytond -d trytondb。
Q2:初始化时 --email admin@example.com 报错?
实测报错:
trytond-admin: error: argument --email: invalid validate_email value: 'admin@example.com'
官方镜像(Python 3.13)的邮箱校验器按 RFC 域名规则拒绝 example.com 这类保留域。换一个可解析域名的邮箱即可,本文用 admin@quzuo.net。
Q3:访问 http://localhost:8135/ 返回 405 Method Not Allowed?
正常现象。trytond 根路径只接受 CORS 预检(OPTIONS),业务接口路径为 /rpc/(公共方法)与 /<数据库名>/rpc/(库级方法),按第七节验证即可。
Q4:docker compose exec tryton ... 报 service "tryton" is not running?
exec 要求容器在运行状态。服务停止期间执行管理命令请改用 docker compose run --rm -T tryton <命令>(本文第六节的写法),它会临时拉起一个同配置的一次性容器。
Q5:数据会不会随容器删除丢失?
不会。PostgreSQL 数据在命名卷 tryton-8-2-stack_pgdata 中,docker compose down 不删卷;只有 docker compose down -v 才会连卷一起删除。
十、卸载清理
停止并移除编排栈(保留数据卷):
cd /opt/tryton-compose
docker compose down
连数据卷一起彻底清理:
docker compose down -v
docker rmi tryton/tryton:8.2 postgres:16-alpine
十一、参考链接
- tryton/tryton 官方镜像(Docker Hub):https://hub.docker.com/r/tryton/tryton (查询日期 2026-10-25)
- Tryton 官方下载页:https://www.tryton.org/download (查询日期 2026-10-25)
- 官方文档 - 服务端配置与环境变量:https://docs.tryton.org/projects/server/en/latest/ (查询日期 2026-10-25)
- postgres 官方镜像(Docker Hub):https://hub.docker.com/_/postgres (查询日期 2026-10-25)