ToolJet 使用 Docker Compose 部署完整指南:内置与外部 PostgreSQL 双方案、备份恢复与 LTS 升级实战

发布时间:2026/11/2 21:22:00

ToolJet 使用 Docker Compose 部署完整指南:内置与外部 PostgreSQL 双方案、备份恢复与 LTS 升级实战 ToolJet 使用 Docker Compose 部署完整指南内置与外部 PostgreSQL 双方案、备份恢复与 LTS 升级实战【免费下载链接】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 部署实战指南。围绕 setup/docker.md 文档展开覆盖「内置 PostgreSQL 数据库」与「外部托管 PostgreSQL 数据库」两种官方部署模式并深入讲解.env关键变量、internal.sh/external.sh脚本的密钥生成逻辑、数据库备份与恢复流程以及升级到最新 LTS 版本的前置要求。读完本文你将能够在任意 Linux 服务器上独立完成 ToolJet 的生产级 Docker 部署并掌握后续维护升级的关键操作。部署架构总览ToolJet 是一个用于构建内部工具、仪表盘与业务应用的开放源代码平台。其服务端基于 NestJS客户端为 React 前端二者在容器中由tooljet/tooljet-ce镜像统一承载并以npm run start:prod启动见 deploy/docker/docker-compose-db.yaml。ToolJet 的生产部署依赖以下基础设施PostgreSQL 数据库用于存储应用定义、数据源加密后的凭据以及用户认证数据PostgREST 服务当启用 ToolJet Database内置数据存储时由它对外提供 RESTful APIRedis在 CE 镜像中作为内置 sidecar 由入口脚本自动拉起用于缓存与会话支撑见 docker/ce-entrypoint.sh。Docker Compose 部署提供两种官方方案你可以根据是否有现成的托管数据库进行选择内置 PostgreSQL推荐Compose 文件中直接编排postgres:13官方镜像开箱即用外部 PostgreSQL适用于已使用 AWS RDS、Google Cloud SQL 等托管服务的场景仅需提供数据库连接信息。两种方案对应的 Compose 文件与初始化脚本均可在仓库的 deploy/docker 目录下找到下文将逐一展开。前置条件安装 Docker 与 Docker Compose在开始部署前请先在服务器上安装 Docker Engine 与 Docker Compose。官方安装文档对应Docker Engine 安装https://docs.docker.com/engine/install/Docker Compose 安装https://docs.docker.com/compose/install/两个实用建议官方文档同样强调为 Docker 配置非 root 运行参照 https://docs.docker.com/engine/install/linux-postinstall/ 将当前用户加入docker组避免每次执行都加sudoLinux 服务器上的 sudo 场景如果你的docker命令需要 sudo 权限将本文中的docker-compose up -d替换为sudo docker-compose up -d即可。方案一使用内置 PostgreSQL 数据库推荐1. 下载生产 Compose 文件并创建数据目录在服务器上执行以下命令从官方部署源拉取生产环境的 Compose 文件并将其重命名为标准的docker-compose.yaml同时创建 PostgreSQL 数据挂载目录curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose-db.yaml mv docker-compose-db.yaml docker-compose.yaml mkdir postgres_data该 Compose 文件在仓库中的对应版本为 deploy/docker/docker-compose-db.yaml其中几个关键编排点值得留意服务说明tooljet使用tooljet/tooljet-ce:latest镜像restart: always保证崩溃自动拉起通过env_file: .env注入配置映射宿主机80端口postgres使用postgres:13官方镜像容器名取${PG_HOST}的值数据卷以 bind 方式挂载到当前目录下的postgres_datapostgrest使用postgrest/postgrest:v12.0.2depends_on: postgres保证启动顺序供 ToolJet Database 使用注意内置方案的数据卷是 bind mount 到./postgres_data的见 deploy/docker/docker-compose-db.yaml这正是第一步需要mkdir postgres_data的原因目录不存在会导致卷挂载失败。2. 生成 .env 文件与安全密钥下载.env模板与初始化脚本并将模板重命名为.envcurl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.internal.example curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/internal.sh chmod x internal.sh mv .env.internal.example .env ./internal.shinternal.sh的作用是自动生成一套生产级安全密钥与数据库口令避免你手动填写易被爆破的弱密码。其源码位于 deploy/docker/internal.sh核心逻辑如下LOCKBOX_MASTER_KEY通过openssl rand -hex 32生成 32 字节十六进制串。ToolJet 服务端用它加密所有数据源凭据lockbox 加密体系对应变量说明见 env-vars.mdSECRET_KEY_BASE通过openssl rand -hex 64生成 64 字节十六进制串用于加密会话 CookiePGRST_JWT_SECRET通过openssl rand -hex 32生成供 PostgREST 做 JWT 认证PG_PASS/TOOLJET_DB_PASS通过openssl rand -base64 12 | tr -d / | cut -c1-16生成 16 位随机数据库密码PGRST_DB_URI自动拼接为postgres://postgres:passwordpostgresql/tooljet_db写入.env。脚本使用awk以幂等方式更新.env变量已存在则替换不存在则追加因此可以安全地重复执行。如果某个密钥已生成再次运行时会提示 already exists 并跳过避免覆盖已有配置。如果你希望手工生成这些密钥例如不用脚本等价命令为openssl rand -hex 32LOCKBOX_MASTER_KEY / PGRST_JWT_SECRET与openssl rand -hex 64SECRET_KEY_BASE。3. 启动容器docker-compose up -dToolJet 服务端入口脚本 docker/ce-entrypoint.sh 在容器启动时会依次完成若检测到 Redis 未运行则使用内置配置拉起 Redis sidecar加载容器内.env如果存在根据DATABASE_URL是否设置通过wait-for-it.sh等待 PostgreSQL 就绪超时 300 秒执行npm run db:setup:prod生产构建完成数据库 schema 初始化最后exec $启动npm run start:prod主进程。因此docker-compose up -d后即使看到容器短暂退出重启也往往是等待数据库初始化的正常过程可通过docker-compose logs -f观察日志确认最终状态。4. 配置 TOOLJET_HOST 与自定义域名可选TOOLJET_HOST是 ToolJet 客户端对外访问的公共 URL为必填项可在.env中修改。它既可以是服务器的公网 IPv4 地址也可以是你绑定的自定义域名TOOLJET_HOSThttp://12.34.56.78 # 或 TOOLJET_HOSThttps://tooljet.yourdomain.com注意事项TOOLJET_HOST必须以http://或https://开头否则客户端无法正确解析资源路径如果使用了自定义域名请在 DNS 中添加一条指向服务器 IP 的A 记录更多可配置环境变量请参考 env-vars.md例如USER_SESSION_EXPIRY会话过期时间默认 2880 分钟即 10 天、DISABLE_SIGNUPS限制注册、CHECK_FOR_UPDATES更新检查等。方案二使用外部 PostgreSQL 数据库如果你希望复用 AWS RDS、Google Cloud SQL 等托管 PostgreSQL或者已有独立维护的数据库实例选择本方案。区别在于 Compose 文件不再编排postgres服务仅保留tooljet与可选的postgrest见 deploy/docker/docker-compose.yaml。1. 准备外部数据库先在云服务商或自建环境中创建一个 PostgreSQL 数据库实例并确保数据库对 ToolJet 服务器可达安全组 / 防火墙放行对应端口你手头有数据库的用户名、密码、主机名、数据库名四项信息该账号具备建库与创建扩展的权限ToolJet 默认会在启动时基于PG_DB创建数据库并尝试创建 PostgreSQL 扩展若无法授予 CREATEDB 权限可设置PG_DB_OWNERfalse并手动初始化见 env-vars.md。2. 下载外部数据库版 Compose 文件curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose.yaml3. 生成 .env 并录入外部数据库凭据curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.external.example curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/external.sh chmod x external.sh mv .env.external.example .env ./external.sh与内置方案不同external.sh源码见 deploy/docker/external.sh会交互式提示你输入外部数据库信息Enter PostgreSQL database username: Enter PostgreSQL database hostname: Enter PostgreSQL database password: Enter PostgreSQL database name:脚本随后自动完成三件事将输入值写入.env的PG_USER、PG_HOST、PG_PASS、PG_DB把 PG 前缀的值同步复制到 ToolJet Database 使用的TOOLJET_DB_USER、TOOLJET_DB_HOST、TOOLJET_DB_PASS拼接PGRST_DB_URIpostgres://user:passhost/tooljet_db写入.env。注意外部方案中PG_HOST必须填外部数据库的真实主机名如db.example.com而不能像内置方案那样填postgresql这个 Compose 网络内的服务名。4. 启动容器docker-compose up -d5. 自签名 HTTPS 证书场景可选如果 ToolJet 需要连接使用了自签名 HTTPS 证书的端点请确保在.env中设置NODE_EXTRA_CA_CERTS环境变量指向包含 CA 证书的 PEM 文件绝对路径如/ToolJet/ca/cert.pem。该文件需为 PEM 格式可包含多张证书相关说明见 env-vars.md。关键环境变量速查表两种方案共用的.env模板位于 deploy/docker/.env.internal.example 与 deploy/docker/.env.external.example下面汇总部署阶段最关键的变量变量必填说明TOOLJET_HOST✅客户端公共 URL必须以http(s)://开头LOCKBOX_MASTER_KEY✅32 字节十六进制串用于加密数据源凭据SECRET_KEY_BASE✅64 字节十六进制串用于加密会话 CookiePG_HOST✅PostgreSQL 主机内置方案填postgresqlPG_DB✅数据库名内置模板默认tooljet_productionPG_USER/PG_PASS✅数据库用户名 / 密码TOOLJET_DB_HOST/USER/PASS启用 ToolJet DB 时内置数据存储的连接信息PGRST_DB_URI启用 ToolJet DB 时PostgREST 连接串格式postgres://user:passhost/dbPGRST_JWT_SECRET启用 ToolJet DB 时PostgREST JWT 密钥不设置则 PostgREST 拒绝认证请求CHECK_FOR_UPDATES否每 24 小时检查更新设false/0关闭默认开启DISABLE_TOOLJET_TELEMETRY否每 24 小时上报用户数遥测设true关闭默认开启DEPLOYMENT_PLATFORM否标记部署平台模板中为dockerUSER_SESSION_EXPIRY否会话过期时间分钟默认288010 天完整变量说明请参阅 env-vars.md其中还包含 SMTP 邮件、Google OAuth、SSO、Sentry APM、多语言LANGUAGE等可选配置。Docker 备份与恢复仅限内置 PostgreSQL对于内置 PostgreSQL 方案官方提供了backup-restore.sh一键脚本同时支持备份与恢复curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-restore.sh chmod x backup-restore.sh ./backup-restore.sh运行脚本后会进入交互式菜单选择备份或恢复操作。备份的本质是对postgres容器中的数据库执行pg_dump导出恢复则通过psql导入因此恢复目标环境需要有可用的 PostgreSQL 服务。建议无论采用哪种方案在升级版本或重大变更前都应对数据库执行一次完整备份。外部 PostgreSQL 方案可直接使用云厂商的快照或pg_dump工具完成备份。升级到最新 LTS 版本ToolJet 的 LTS长期支持版本大约每 35 个月发布一次每个 LTS 版本的生命周期至少 18 个月。镜像标签遵循LTS-前缀加版本号的命名约定例如tooljet/tooljet:EE-LTS-latest。适用范围本指南仅适用于已部署旧版本的存量安装如果是全新安装直接使用最新镜像即可无需执行升级流程。升级前置要求务必先对数据库做完整备份防止升级过程中数据丢失版本门槛运行版本早于v2.23.0-ee2.10.2的用户必须先升级到该版本再继续升级到 LTS 版本不能跨版本直接跳升。升级操作要点升级的核心思路是替换镜像标签后重建容器# 1. 先在 .env 或 docker-compose.yaml 中将镜像 tag 更新为目标 LTS 版本 # 2. 拉取新镜像并重建容器 docker-compose pull tooljet docker-compose up -d --remove-orphans由于 ToolJet 依赖数据库迁移机制仓库 server/migrations 与 server/data-migrations 中保存了大量历史迁移脚本新版本首次启动时服务端会自动执行新增迁移。因此升级后请重点观察日志中的迁移执行情况确认应用正常进入监听状态。若升级过程遇到问题可借助备份进行回滚恢复。部署后的验证与排障完成部署后建议按以下顺序验证访问 Web 界面浏览器打开TOOLJET_HOST对应的地址如http://服务器IP应出现 ToolJet 的登录/注册页面检查容器状态docker-compose ps确认tooljet、postgres内置方案、postgrest均为运行状态查看服务日志docker-compose logs -f tooljet确认npm run start:prod成功监听80端口Compose 中设置了SERVE_CLIENT: true由服务端直接托管前端静态资源首次启动等待数据库初始化与迁移可能耗时数分钟期间容器可能显示Restarting属正常现象。常见问题速查现象排查方向容器反复重启查看日志是否卡在等待 PostgreSQLwait-for-it超时 300 秒确认PG_HOST与端口可达访问出现 502/404确认TOOLJET_HOST是否以http(s)://开头SERVE_CLIENT是否为trueToolJet Database 不可用确认ENABLE_TOOLJET_DB、PGRST_DB_URI、PGRST_JWT_SECRET均已正确设置80 端口被占用修改 deploy/docker/docker-compose-db.yaml 中的端口映射为8080:80等自定义端口小结本文完整梳理了 ToolJet 基于 Docker Compose 的两种生产部署路径内置 PostgreSQL 方案适合快速起步推荐外部 PostgreSQL 方案适合已有托管数据库的团队同时给出了密钥生成脚本、环境变量速查、备份恢复以及 LTS 升级的完整操作指引。部署过程中涉及的所有 Compose 编排、初始化脚本与入口逻辑均可直接在仓库的 deploy/docker、docker/ce-entrypoint.sh 与 docker/ce-production.Dockerfile 中查看源码便于你按需定制自己的部署方案。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/10/28 12:40:55

ASP.NET Web Forms学生成绩系统实战指南

简介:本资源是一套完整的ASP.NET学生成绩信息管理系统实战项目,面向.NET初学者、高校计算机专业学生及教育信息化开发人员,解决校园成绩管理流程数字化、权限可控、数据可统计的核心需求。压缩包共177个文件,9.15MB,涵…

2026/11/3 19:22:20

5.1 变脸游戏

📖实验简介本次实验使用微信小程序加速计 API wx.onAccelerometerChange,实现变脸小游戏。实现两种切换脸谱方式:点击图片切换、摇晃手机切换脸谱;扩展功能:统计并展示累计变脸总次数。 开发环境:微信开发者…

2026/11/3 19:22:20

V. V. Prasolov. Intuitive Topology

V. V. Prasolov 所著的《Intuitive Topology》是拓扑学领域口碑极佳的低门槛入门经典,属于美国数学会《Mathematical World》系列第4卷,全书仅93页,完全以直观可视化的方式讲解初等拓扑核心内容,零基础友好。 📖 基础…

2026/11/3 19:22:20

ESP32-S3 呼微信接通后没声音之解决办法

ESP32-S3 呼微信接通后没声音之解决办法 上一篇:移芯 EC718PM 上说话一卡一卡之解决办法 本文代码来自开源仓库 github.com/tangeai/xiaotai-esp32(主工程 lckfb-szpi-esp32s3-tirtc/)。代码有节选,常量和结构没改。 把微信语音通…

2026/11/3 19:22:20

中亚跨境物流避坑指南:渠道选型、密度计费与清关实操全拆解

中亚跨境物流避坑指南:渠道选型、密度计费与清关实操全拆解 做跨境供应链这几年,接触过上百位发中亚、俄线的卖家和采购商,发现 90% 的新手第一次发货都会踩同一个坑:只看单价,忽略计费规则、清关能力和渠道稳定性&…

2026/11/3 19:22:20

知漫剧解决人物漂移:角色锁定与素材库双保险

AI 漫剧连载生产中,人物形象漂移是长期困扰创作者的难点,反复调试提示词也很难稳住人设。知漫剧(zz.jiaxunai.cn)依托角色锁定机制与素材库管理形成双重保障,在批量生产漫剧时稳定角色外观,搭配全链路工作台…

2026/11/3 19:17:20

Godot 入门(07):InputMap,让键盘管住小人

坐标搞明白晒,小人仲系个钉子户,钉喺 (96,64) 郁都唔郁。 这回给它接上键盘。 顺手堵咗个新手最常犯嘅毛病:按住唔放,人物一路跑飞。 一、先别写代码,先去配键 新手容易犯一个毛病,一上手就在脚本里写 if Input.is_key_pressed(KEY_W)。能跑,真的能跑。 但这条路走不远…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑