news 2026/9/12 7:05:22

ToolJet 贡献者 Docker 本地开发环境搭建全指南:从 Compose 一键启动到断点调试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ToolJet 贡献者 Docker 本地开发环境搭建全指南:从 Compose 一键启动到断点调试

ToolJet 贡献者 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

本文是面向ToolJet 贡献者的 Docker 开发环境搭建指南,覆盖从 fork/克隆仓库、生成环境变量、构建镜像到docker compose up一键启动的完整流程,并深入讲解服务架构(client / server / plugins / postgres / redis / postgrest)、热重载机制、测试运行方式以及基于 VSCode +docker-compose-debug.yaml的容器内断点调试方案。读完本文,你将能在本地独立启动一套可开发的 ToolJet 环境,并具备修改代码、运行单测/e2e 测试与容器调试的完整能力。

注意:本指南面向代码贡献者的本地开发场景。如果你只是想自托管部署 ToolJet,请参考 部署 Setup 文档,那里有面向生产环境的配置说明;如果只是想快速试用,可以按 Try ToolJet 的步骤在本地跑起来。

为什么用 Docker Compose 搭建开发环境

ToolJet 是一个前后端分离的复杂工程:server(NestJS 后端)、frontend(React 客户端)、plugins(数据源插件包),外加 PostgreSQL、Redis、PostgREST 等基础设施服务。如果手工安装,需要同时配置 Node.js 22、PostgreSQL 13、Redis 7、PostgREST v12.2.0 以及 Oracle Instant Client 等系统级依赖,极易出现环境不一致。

Docker Compose 是官方推荐的本地开发方式——仓库根目录的 docker-compose.yaml 一次性定义了全部 6 个服务,并且通过卷挂载实现代码热重载。其服务拓扑如下:

服务名镜像 / 构建来源对外端口作用
clientdocker/client.Dockerfile.dev8082React 前端 dev server(webpack)
serverdocker/server.Dockerfile.dev3000NestJS 后端 API
pluginsdocker/plugins.Dockerfile.dev数据源插件构建与监听
postgrespostgres:135432主数据库与 ToolJet Database
redisredis:7-alpine6379缓存 / 队列
postgrestpostgrest/postgrest:v12.2.03001→3000ToolJet Database 的 REST 网关

后端服务之间通过 Compose 内部网络互通(REDIS_HOST=redisPG_HOST=postgresPGRST_HOST=postgrest),无需手动配置主机名。

前置条件

  • 安装最新版本的dockerdocker compose(官方安装指南见 Docker Desktop 与 Docker Compose 官方文档,仓库文档 docker.md 中附有官方链接)。
  • Windows 用户:建议使用 Docker Desktop + WSL2,并且务必在 WSL2 终端内执行后续所有命令;同时注意.env文件的行尾必须是LF(Windows 默认的 CRLF 会导致容器内读取异常)。

六步搭建本地开发环境

1. Fork 并克隆仓库

进入 ToolJet 的 GitHub 仓库页面点击Fork按钮,把仓库复制到自己的账号下,然后克隆到本地:

git clone https://github.com/<your-username>/ToolJet.git

2. 从示例文件创建.env

cp ./deploy/docker/.env.internal.example .env

模板文件位于 deploy/docker/.env.internal.example。它按功能分组给出了开发环境所需的核心变量:

  • 基础TOOLJET_HOST(默认http://localhost:8082)、LOCKBOX_MASTER_KEYSECRET_KEY_BASE
  • 数据库PG_DB=tooljet_productionPG_USER=postgresPG_HOST=postgresqlPG_PASS,以及 ToolJet Database 专用的TOOLJET_DBTOOLJET_DB_USERTOOLJET_DB_HOSTTOOLJET_DB_PASS
  • PostgRESTPGRST_DB_URIPGRST_HOST=postgrestPGRST_JWT_SECRET
  • 功能开关CHECK_FOR_UPDATESDISABLE_TOOLJET_TELEMETRYCOMMENT_FEATURE_ENABLEENABLE_MULTIPLAYER_EDITING=true
  • SSO / 邮件 / 可观测性:Google OAuth、SMTP、Sentry 等可选配置(留空即可)。

各变量的完整含义与取值范围可查阅 环境变量参考文档。

3. 用脚本自动生成密钥与密码

chmod +x ./deploy/docker/internal.sh && ./deploy/docker/internal.sh

脚本 deploy/docker/internal.sh 会安全地回写.env,自动补齐 5 类敏感值:

变量生成方式用途
LOCKBOX_MASTER_KEYopenssl rand -hex 32凭据加密的 lockbox 主密钥
SECRET_KEY_BASEopenssl rand -hex 64应用会话与签名密钥
PGRST_JWT_SECRETopenssl rand -hex 32PostgREST JWT 认证密钥
PG_PASS/TOOLJET_DB_PASSopenssl rand -base64 12处理后取 16 位PostgreSQL 密码
PGRST_DB_URI用生成的密码拼装postgres://postgres:<pass>@postgresql/tooljet_dbPostgREST 连接串

脚本具有幂等性:检测到变量已存在时会跳过并打印提示,不会覆盖已有配置,可安全重复执行。

4. 构建镜像并编译插件

docker compose build docker compose run --rm plugins npm run build:plugins

第一步会分别构建pluginsclientserver三个开发镜像。从 docker/server.Dockerfile.dev 可以看到,server 镜像基于node:22.15.1-bullseye,除常规编译工具外还内置了postgresql-clientfreetds-dev(SQL Server 驱动依赖)、Oracle Instant Client(含LD_LIBRARY_PATH配置)等数据库客户端依赖,并设置NODE_OPTIONS=--max-old-space-size=4096规避 webpack/TypeScript 编译时的堆内存溢出。client 镜像则把frontend/node_modules/.bin加入PATH并同样设置了 4096MB 堆上限。

第二步在plugins容器内执行build:plugins,生成数据源插件产物,供 server/client 容器挂载使用。

5. 启动 ToolJet

docker compose up

启动后,前端通过 docker-compose.yaml 将宿主机8082映射到 client 容器,因此访问http://localhost:8082即可打开 ToolJet 界面。server 容器的entrypoint(docker/dev-entrypoint.sh)在启动时自动完成一系列初始化:

  1. 通过wait-for-it.sh等待 PostgreSQL(默认postgres:5432)、Redis(redis:6379)、PostgREST(postgrest:3000)就绪;
  2. 检查并自动创建tooljet_production(主库)与tooljet_db(ToolJet Database)两个数据库;
  3. 按构建产物是否存在,自动执行npm run db:setup(开发模式,即db:create+db:migrate)或db:setup:prod
  4. 最后以npm run --prefix server start:dev启动 NestJS 开发服务器。

因此首次启动不需要手动执行迁移命令,容器会自举完成建库与迁移。

6. 停止容器

docker compose stop

修改代码:热重载与镜像重建策略

docker compose up以卷挂载方式(./server:/app/server:delegated./frontend:/app/frontend:delegated./plugins:/app/plugins)把本地源码注入容器,同时用匿名卷隔离容器内的node_modules,避免与宿主机依赖冲突。因此:

  • 普通代码改动:server 容器会自动热重载,无需任何手动操作;client 侧由 webpack dev server 负责。
  • 涉及数据库迁移或新增 npm 依赖package.json变更):需重启 server 容器使迁移脚本与新依赖生效:
    docker compose restart server
  • 需要向容器添加新的二进制或系统库:编辑 docker/server.Dockerfile.dev,在RUN apt-get update && apt-get install -y ...一行追加包名,然后重建镜像:
    docker compose build server docker compose up

文档给出了一个典型示例:假设要安装imagemagick,则在 Dockerfile 的apt install列表中追加imagemagick,使其在构建阶段被安装到 server 容器中。以此类推,任何 apt 可用的系统库都可按同样方式注入。

在容器内运行测试

测试配置从项目根目录的.env.test文件读取(该文件也被挂载进 server 容器,见 docker-compose.yaml),与开发环境.env相互隔离。

  1. 创建并迁移测试数据库(两条命令均在NODE_ENV=test下执行,对应server/package.json中的db:createdb:migrate脚本):
    docker compose run --rm -e NODE_ENV=test server npm run db:create docker compose run --rm -e NODE_ENV=test server npm run db:migrate
  2. 运行全部单元测试
    docker compose run --rm server npm run --prefix server test
  3. 运行 e2e 测试(对应server/package.json中的test:e2e,内部执行scripts/run-e2e.sh):
    docker compose run --rm server npm run --prefix server test:e2e
  4. 运行单个单元测试文件
    docker compose run --rm server npm --prefix server run test <path-to-file>

用 VSCode 调试 Docker 容器中的 client / server

仓库为容器调试预置了完整的 VSCode 配置,开箱即用。

基础设施

  • Compose 调试覆盖文件:docker-compose-debug.yaml 为server服务额外映射端口9229:9229,并把启动命令切换为npm run --prefix server start:debug -- --debug 0.0.0.0:9229(对应server/package.json中的start:debug,即nest start --debug --watch),使 Node 进程以调试模式监听 9229 端口。
  • VSCode 任务:.vscode/tasks.json 定义了docker-compose: debug:clientdocker-compose: debug:server两个任务,会以 detached 模式、叠加docker-compose-debug.yaml启动对应服务。
  • VSCode 启动配置:.vscode/launch.json 提供两个调试配置:
    • Docker Debug ClientpreLaunchTask先拉起 client 容器,然后以 Chrome 调试器附加到http://127.0.0.1:8082webRoot指向frontend源码;
    • Docker Debug ServerpreLaunchTask先拉起 server 容器,再通过docker调试平台附加到容器内9229端口,并完成localRoot${workspaceRoot}/server)与remoteRoot/app/server)的源码映射,sourceMaps已开启。

手动启动调试模式

也可以不使用 VSCode,直接在命令行叠加调试配置启动:

docker-compose -f docker-compose.yaml -f docker-compose-debug.yaml up --build

操作步骤

  1. 用 VSCode 打开 ToolJet 仓库根目录;
  2. 点击左侧活动栏的Run and Debug(调试)图标;
  3. 在配置下拉框中选择Docker Debug ClientDocker Debug Server
  4. 按 F5 启动——VSCode 会自动执行前置任务拉起容器,随后附加调试器,即可在源码中设置断点、实时查看变量、观察调用栈。

这套配置让贡献者无需离开 IDE 就能完成「改代码 → 断点调试 → 修复」的闭环,也降低了团队间调试环境不一致带来的协作成本。

常见问题

  • Windows 下容器启动异常:检查.env行尾是否为 LF(可在 VSCode 右下角或通过sed -i 's/\r$//' .env转换),并确认命令运行在 WSL2 终端中。
  • 首次启动较慢:需要依次完成基础镜像拉取、npm install(server/frontend/plugins 三套依赖)与插件构建,属正常现象;后续增量启动会快得多。
  • 端口冲突8082(client)、3000(server)、5432(postgres)、6379(redis)、3001(postgrest)、9229(调试)均为对外映射端口,如与本机已有服务冲突,可在docker-compose.yamldocker-compose-debug.yaml中调整宿主机侧端口。

如果仍无法解决,可在 ToolJet 的 GitHub Issues 提交新问题,或加入官方 Slack 社区寻求帮助(入口见 docker.md 的 Troubleshooting 一节)。

相关资源

  • 贡献指南入口:CONTRIBUTING.md、贡献者文档
  • 环境变量完整参考:docs/docs/setup/env-vars.md
  • 快速试用(非开发模式):docs/docs/setup/try-tooljet.md
  • Compose 主配置:docker-compose.yaml;调试覆盖配置:docker-compose-debug.yaml
  • server 端 npm 脚本(db:create/db:migrate/db:setup/test:e2e/start:debug的定义):server/package.json

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 7:04:27

从提示词收藏到Agent Skills:构建可复用AI技能库的工程化实践

说个最近一直在琢磨的事。我也是被 Andrej Karpathy 在公开分享里反复提到的那个观点“真正重要的不是某个 prompt 写得有多精巧&#xff0c;而是你能不能把一次成功的工作方式沉淀成可复用的能力”反复敲打&#xff0c;最后彻底掉进了 Agent Skills 这个坑。这一年多&#xff…

作者头像 李华
网站建设 2026/9/12 7:03:15

JSON与JavaScript对象的本质区别及实战应用

1. JSON与JavaScript对象的本质区别前端开发中&#xff0c;JSON和JavaScript对象看似相似&#xff0c;实则存在根本性差异。JSON&#xff08;JavaScript Object Notation&#xff09;本质上是一种轻量级的数据交换格式&#xff0c;而JavaScript对象是语言层面的数据结构实体。最…

作者头像 李华
网站建设 2026/9/12 7:02:26

S7-200 PLC机械手搬运控制系统设计与实现

1. 项目概述&#xff1a;工业自动化中的机械手搬运控制系统这个基于S7-200 PLC和组态王的机械手搬运控制系统&#xff0c;是典型的工业自动化应用案例。我在汽车零部件生产线调试时&#xff0c;曾用类似方案解决过传送带与机械手的协同问题。系统核心是通过PLC程序控制机械手完…

作者头像 李华
网站建设 2026/9/12 7:01:29

动态群聊二维码:提升社群运营效率的利器

1. 动态群聊二维码的价值与应用场景在社群运营和私域流量管理中&#xff0c;动态群聊二维码正在成为提升运营效率的利器。相比传统静态二维码&#xff0c;动态二维码的核心优势在于可随时更新群组链接而不需要更换图片。这意味着当旧群满员后&#xff0c;系统会自动将新用户引导…

作者头像 李华
网站建设 2026/9/12 7:01:10

Python文件遍历利器:os.walk深度解析与实战

1. Python文件遍历利器&#xff1a;os.walk深度解析在Python处理文件系统操作时&#xff0c;os模块绝对是每个开发者必备的工具箱。而其中的os.walk()方法&#xff0c;堪称目录遍历的瑞士军刀。我至今记得第一次用这个函数批量处理数万张图片时的惊艳感——原本需要几十行递归代…

作者头像 李华