Tryton 8.2 Docker Compose 部署指南

用 Docker Compose 编排官方镜像 tryton/tryton:8.2 + postgres:16-alpine,含健康检查依赖、TRYTOND_DATABASE_NAMES 关键配置、数据库初始化、模块激活与 JSON-RPC 登录验证。

Tryton2026/10/25

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

二、前置条件

  1. 已安装 Docker 与 Docker Compose 插件:
docker version --format '{{.Server.Version}}'
docker compose version

实测输出:

29.9.2
Docker Compose version v5.6.1
  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.0LTS 系列,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>&#39;res.user&#39;</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

十一、参考链接