使用 Docker Compose 部署 ToolJet:内置 PostgreSQL 与外部数据库两种方案的完整指南
【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet
ToolJet 是基于 Docker Compose 部署的低代码应用平台(内部工具、仪表盘、工作流与 AI 应用生成平台),本文将完整讲解如何在服务器上通过 Docker Compose 部署 ToolJet,涵盖"内置 PostgreSQL"与"外部 PostgreSQL"两种生产方案、密钥初始化脚本的工作原理、TOOLJET_HOST等核心环境变量的配置,以及升级到最新 LTS 版本与数据库备份恢复的实操步骤。读完本文,你将能够从零搭建一套可对外提供服务的 ToolJet 生产实例,并掌握其容器编排结构、数据安全与版本升级要点。
提示:如果你只是想在本机 Docker 中快速体验 ToolJet,可以参考 Try ToolJet 文档。
为什么需要 PostgreSQL
ToolJet 在运行时依赖一个 PostgreSQL 数据库来存储三类核心数据:
- 应用定义(applications definitions):画布上的组件、布局、事件与页面结构;
- 数据源凭据(encrypted credentials for datasources):各种数据源连接信息,这些凭据会被加密后入库;
- 用户认证数据(user authentication data):账号、会话与权限相关信息。
因此,部署前的第一项准备工作就是准备好 Docker 与 Docker Compose,以及一个可用的 PostgreSQL 实例(无论是内置容器还是外部托管服务)。
安装 Docker 与 Docker Compose
在服务器上安装 Docker 与 Docker Compose 是部署的前提。官方安装文档如下:
- Docker 安装文档
- Docker Compose 安装文档
安装完成后,建议按官方 Linux 后置安装指引配置 Docker 以非 root 用户运行;如果服务器是 Linux 且docker命令需要 sudo 权限,后续启动命令可写成:
sudo docker-compose up -d两种部署方案选型
根据数据库的托管方式,Docker Compose 部署分为两种:
- 内置 PostgreSQL 数据库(推荐):使用官方 PostgreSQL Docker 镜像,随 ToolJet 一起启动,适合大多数自托管场景;
- 外部 PostgreSQL 数据库:连接 AWS RDS、Google Cloud SQL 等托管数据库服务,适合已有数据库基础设施或对数据库运维有更高要求的场景。
两种方案共用同一套 ToolJet 主容器,差异主要体现在docker-compose文件内容与.env的初始化方式上。
方案一:使用内置 PostgreSQL 部署
第 1 步:下载生产环境 compose 文件
将生产环境的 docker-compose 文件下载到服务器,并重命名为docker-compose.yaml:
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/docker-compose-db.yaml mv docker-compose-db.yaml docker-compose.yaml mkdir postgres_datamkdir postgres_data用于创建 PostgreSQL 数据目录。在仓库自带的 docker-compose-db.yaml 中可以看到,postgres服务的数据卷正是以 bind mount 的方式挂载到${PWD}/postgres_data目录:
volumes: postgres: driver: local driver_opts: o: bind type: none device: ${PWD}/postgres_data这意味着所有数据库文件都会持久化在服务器本地目录中,容器删除后数据依然保留。
第 2 步:生成 .env 文件并初始化密钥
在docker-compose.yaml所在目录执行:
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/.env.internal.example curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/internal.sh && chmod +x internal.sh mv .env.internal.example .env && ./internal.shinternal.sh的作用是自动生成 .env 中缺失的核心密钥变量。从仓库中对应的 internal.sh 实现可以看到,它依次做了这些事:
LOCKBOX_MASTER_KEY:若为空,用openssl rand -hex 32生成一个 32 字节的十六进制字符串,用于加密数据源凭据;SECRET_KEY_BASE:若为空,用openssl rand -hex 64生成 64 字节十六进制字符串,用于加密会话 Cookie;PGRST_JWT_SECRET:若为空,生成 32 字节十六进制字符串,供 PostgREST 的 JWT 认证使用;PG_PASS/TOOLJET_DB_PASS:生成一个 16 位随机密码作为 PostgreSQL 数据库密码;PGRST_DB_URI:自动拼接为postgres://postgres:<password>@postgresql/tooljet_db形式的数据库连接串。
脚本通过awk就地更新.env文件,已存在的变量不会被覆盖,因此可以安全地重复执行。
第 3 步:启动容器
docker-compose up -d第 4 步(可选):配置 TOOLJET_HOST
TOOLJET_HOST用于声明 ToolJet 的对外访问地址,可以是服务器的公网 IPv4 地址,也可以是自定义域名,在.env文件中修改:
TOOLJET_HOST=http://12.34.56.78或
TOOLJET_HOST=https://tooljet.yourdomain.com注意:
TOOLJET_HOST必须以http://或https://开头;- 如果使用了自定义域名,需要在 DNS 中添加一条 A 记录,指向服务器的 IP 地址;
- 更多可配置的环境变量,请参考 环境变量文档。
方案二:使用外部 PostgreSQL 部署
第 1 步:准备数据库
先在 AWS RDS、Google Cloud SQL 或自建环境中创建一个 PostgreSQL 数据库,并确保 ToolJet 服务器可以访问它。
第 2 步:下载 compose 文件
外部数据库方案使用不包含postgres服务的 compose 文件:
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/docker-compose.yaml在仓库的 docker-compose.yaml 中可以看到,该文件只定义了tooljet主服务与一个postgrest服务(后者用于 ToolJet Database 的 REST 化访问,未启用 ToolJet Database 时可注释掉)。
第 3 步:初始化 .env 并填写外部数据库凭据
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/external.sh curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/.env.external.example && chmod +x external.sh mv .env.external.example .env && ./external.sh执行external.sh时,脚本会交互式提示你依次输入外部数据库的PG_USER(用户名)、PG_HOST(主机名)、PG_PASS(密码)与PG_DB(数据库名)。从仓库对应的 external.sh 实现可以看到,脚本除了生成与 internal.sh 相同的 LOCKBOX / SECRET_KEY_BASE / PGRST_JWT_SECRET 密钥之外,还会:
- 将输入的四个 PG 变量写入
.env; - 自动把
PG_USER、PG_HOST、PG_PASS复制为TOOLJET_DB_USER、TOOLJET_DB_HOST、TOOLJET_DB_PASS,供 ToolJet Database 使用; - 拼接
PGRST_DB_URI=postgres://<PG_USER>:<PG_PASS>@<PG_HOST>/tooljet_db写入.env。
第 4 步:启动容器
docker-compose up -d第 5 步(可选):配置 TOOLJET_HOST 与自定义 CA
TOOLJET_HOST的配置方式与内置数据库方案一致。此外,如果 ToolJet 需要连接使用自签名 HTTPS 的服务,请设置环境变量NODE_EXTRA_CA_CERTS为证书文件的绝对路径(PEM 格式,可包含多个证书)。
理解容器编排结构
无论选择哪种方案,tooljet主服务都包含以下关键配置(见 docker-compose-db.yaml):
tooljet: container_name: Tooljet-app image: tooljet/tooljet-ce:latest restart: always env_file: .env ports: - 80:80 environment: SERVE_CLIENT: "true" PORT: "80" command: npm run start:prodimage: tooljet/tooljet-ce:latest:社区版镜像,生产环境建议按需锁定为特定 LTS 标签(如tooljet/tooljet:ee-lts-latest);env_file: .env:所有环境变量从.env注入容器;ports: 80:80:将容器的 80 端口映射到宿主机 80 端口,SERVE_CLIENT=true表示由服务端同时托管前端客户端;restart: always:容器异常退出后自动重启,保证服务可用性。
内置数据库方案中,postgres服务使用postgres:13镜像,通过${PG_HOST}指定容器名,并从.env读取POSTGRES_USER与POSTGRES_PASSWORD;postgrest服务使用postgrest/postgrest:v12.0.2镜像,负责把 ToolJet Database 表暴露为 REST API。
容器启动流程与数据库就绪等待
ToolJet 容器在启动时会执行初始化脚本。从 ce-entrypoint.sh 可以看到其关键逻辑:
- 如果 Redis 尚未运行,则启动内置 Redis(单实例 CE 的伴生服务);
- 加载
.env中的环境变量; - 根据是否存在
server/dist选择npm run db:setup:prod或npm run db:setup; - 通过
wait-for-it.sh等待 PostgreSQL 在${PG_HOST}:${PG_PORT:-5432}就绪(超时 300 秒)后,再执行数据库初始化与迁移。
也就是说,即使容器先于数据库启动,也会耐心等待数据库可用后才完成建库与 schema 初始化,避免了常见的启动竞态问题。而 supervisord.conf 则负责在同一容器内同时托管postgrest与 ToolJet 主进程,并保证任一进程崩溃后自动重启。
数据库备份与恢复(内置 PostgreSQL)
内置数据库方案下,数据库文件保存在宿主机postgres_data目录,因此备份恢复需要借助官方提供的脚本。
- 下载备份恢复脚本:
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-restore.sh && chmod +x backup-restore.sh- 运行脚本:
./backup-restore.sh脚本会引导你完成数据库的备份与恢复操作。
注意:无论使用哪种方案,在升级版本或执行任何有风险操作之前,务必先对数据库做完整备份,防止数据丢失。
升级到最新 LTS 版本
ToolJet 每 3-5 个月发布一个新的 LTS 版本,每个 LTS 版本至少提供 18 个月的维护期。你可以在 ToolJet Docker Hub 的 tags 页面查看最新 LTS 版本,LTS 标签遵循LTS-前缀加版本号的命名规范,例如tooljet/tooljet:ee-lts-latest。
如果你是全新安装,直接使用最新版本即可,无需执行升级流程。对于已有实例的升级,请遵循以下要点:
- 升级前必须对数据库做完整备份,以防数据丢失;
- 版本早于 v2.23.0-ee2.10.2 的用户,必须先升级到该版本,然后才能继续升级到 LTS 版本;
- 升级的具体步骤取决于你的部署方式,Docker 场景下通常为:拉取最新镜像 → 备份数据库 → 更新
.env中的镜像标签 → 重新执行docker-compose up -d。
关键环境变量速查
以下变量是 Docker Compose 部署中直接涉及的核心配置(完整清单见 环境变量文档):
| 变量 | 说明 | 是否必填 |
|---|---|---|
TOOLJET_HOST | ToolJet 客户端对外访问 URL(如https://app.tooljet.com) | 必需 |
LOCKBOX_MASTER_KEY | 32 字节十六进制字符串,用于加密数据源凭据,可用openssl rand -hex 32生成 | 必需 |
SECRET_KEY_BASE | 64 字节十六进制字符串,用于加密会话 Cookie,可用openssl rand -hex 64生成 | 必需 |
PG_HOST | PostgreSQL 主机名(compose 内置数据库场景下可设为postgres,由 Docker DNS 解析) | 必需 |
PG_DB | 数据库名 | 必需 |
PG_USER/PG_PASS/PG_PORT | 数据库用户名 / 密码 / 端口(默认 5432) | 必需 |
PGRST_JWT_SECRET | PostgREST 认证用 JWT 密钥,可用openssl rand -hex 32生成 | 必需 |
PGRST_DB_URI | ToolJet Database 的连接串,格式postgres://用户:密码@主机:端口/数据库 | 必需 |
SERVE_CLIENT | 是否由服务端托管前端客户端,compose 文件中默认true | 可选 |
NODE_EXTRA_CA_CERTS | 自签名 CA 证书的绝对路径(PEM 格式) | 可选 |
CHECK_FOR_UPDATES | 设为0可关闭每 24 小时的版本更新检查 | 可选 |
DISABLE_SIGNUPS | 设为true可禁止公开注册,仅允许邀请加入 | 可选 |
常见问题排查
- 容器启动后一直处于等待状态:通常是数据库未就绪或
PG_HOST/PG_PORT配置错误,可检查wait-for-it.sh的等待日志确认连接目标; docker-compose up -d报权限错误:Linux 服务器上为docker命令加sudo,或按官方后置安装指引配置非 root 运行;- 自定义域名无法访问:确认
TOOLJET_HOST以http:///https://开头,且 DNS 的 A 记录已指向服务器 IP; - HTTPS 自签名证书不受信任:设置
NODE_EXTRA_CA_CERTS指向包含 CA 证书的 PEM 文件; - 需要更换数据库:修改
.env中PG_*与PGRST_DB_URI变量后重启容器,但务必先备份原数据。
通过本文的步骤,你已经可以在任意支持 Docker 的服务器上完成 ToolJet 的生产部署。若希望进一步定制(如配置 SMTP、SSO、多语言等),可继续查阅 环境变量文档 与仓库内的 docker-compose 配置。
【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考