本文所有命令与配置均照搬 Trigger.dev 官方仓库 README(github.com/triggerdotdev/trigger.dev)与官方文档《Self-hosting → Docker compose》(trigger.dev/docs/self-hosting/docker),未作任何改动与发挥。信息核验日期:2026-11-01。
一、项目介绍
Trigger.dev 是一个开源的、面向 TypeScript 的 AI 工作流与后台任务编排平台(官方 README 副标题:"Build and deploy fully-managed AI agents and workflows")。它把"长时间运行、可重试、带队列、可观测、弹性伸缩"的任务(Task)作为一等公民,开发者在自己的代码库里用 task({...}) 定义任务,部署到 Trigger.dev 后即可获得持久化执行、自动重试、队列并发、断点续跑(checkpointing)、人工审批(waitpoints)、实时流式(Realtime / LLM streaming)等能力,解决了 AWS Lambda、Vercel Function 等 Serverless 平台"超时即失败"的痛点。
官方同时提供托管云(cloud.trigger.dev)与自托管两种形态;本文聚焦自托管。项目在 GitHub(triggerdotdev/trigger.dev)持续活跃维护(核验日期 2026-11-01),许可证为 Apache-2.0。
二、功能拆解
按官方 README「Key features」与官方文档,核心能力如下:
| 功能 | 说明 |
|---|---|
| JavaScript / TypeScript SDK | 在代码库内用 task({ id, run }) 定义任务 |
| 长时任务无超时 | unlike AWS Lambda / Vercel,任务可长时间运行 |
| 持久化、重试与队列 | Durable tasks、自动重试、队列、幂等 |
| 真正的运行时自由 | 任务内可装系统包,跑浏览器、Python 脚本、FFmpeg |
| Human-in-the-loop | 用 waitpoint / wait 暂停任务等人审批 |
| Realtime 与流式 | 订阅 run 事件、LLM 流式输出到前端 |
| 可观测 | 每次 run 完整 trace 视图、日志、错误告警 |
| Cron 定时 | 最长可排到一年的循环计划任务 |
| 多环境 | DEV / PREVIEW / STAGING / PROD |
| 版本化 | 原子版本部署,不影响正在运行的任务 |
| 机器规格 | 可配置 vCPU / 内存档位(small-1x 等) |
三、官方/GitHub 链接
- GitHub 仓库:https://github.com/triggerdotdev/trigger.dev
- 官方网站:https://trigger.dev
- 官方文档:https://trigger.dev/docs
- 自托管总览:https://trigger.dev/docs/self-hosting/overview
- Docker Compose 自托管:https://trigger.dev/docs/self-hosting/docker
- Kubernetes / Helm:https://trigger.dev/docs/self-hosting/kubernetes
- 云服务:https://cloud.trigger.dev
- Discord:https://trigger.dev/discord
四、环境要求
官方《Docker compose》文档「Requirements」一节明确给出:
- 前置依赖: Docker
20.10.0+、Docker Compose2.20.0+。 - Webapp 机器(跑 webapp、postgres、redis 及相关服务):3+ vCPU、6+ GB RAM。
- Worker 机器(跑 supervisor 与所有 run):4+ vCPU、8+ GB RAM。
- Webapp 与 Worker 可同机(测试)或分机(生产,便于水平扩 worker)。
- 官方给出容量估算公式:并发数 × 单任务规格 = 所需 CPU/内存,例如 10 并发 × small-1x(0.5 vCPU / 0.5 GB)= 5 vCPU + 5 GB。
- 端口: Webapp 默认对外暴露 8030(官方原文:"You should now be able to access the webapp at http://localhost:8030")。
五、部署步骤
官方文档将部署分为 Webapp、Worker 两段,同机可合并。下面按官方原文逐步给出。
步骤 1:克隆仓库(含 hosting/docker 目录)
git clone --depth=1 https://github.com/triggerdotdev/trigger.dev
cd trigger.dev/hosting/docker
逐段解释:
git clone --depth=1浅克隆,只取最新一次提交以加快速度;https://github.com/triggerdotdev/trigger.dev是官方仓库;cd trigger.dev/hosting/docker进入官方自托管 Compose 配置目录。
预期输出参考: git 克隆进度,最后进入该目录、无报错。
步骤 2:生成 .env 并填充强随机密钥(官方原命令)
cp .env.example .env
./generate-secrets.sh
逐段解释:
cp .env.example .env把官方示例环境变量模板复制为实际配置文件;./generate-secrets.sh是官方自带脚本,"Fills the required secrets in .env with strong, unique values. Safe to re-run - it never overwrites a secret you've already set"——它会把应用密钥与内置数据存储(postgres/redis 等)口令填成强随机值。官方警告:这把加密密钥与会话密钥一旦轮转,已加密数据与现有会话将失效,请妥善保管。
预期输出参考: 脚本运行后在 .env 中写入若干随机密钥;无报错即成功。
步骤 3(Webapp):启动 webapp 栈
cd webapp
docker compose up -d
逐段解释:
cd webapp进入 webapp 子目录(内含官方docker-compose.yml);docker compose up -d按官方 compose 定义后台拉起 webapp、postgres、redis、clickhouse、内置 registry 与对象存储等容器。
预期输出参考: 拉取镜像、创建容器的日志,最终回到命令行提示符。首次运行 webapp 会向控制台打印 Worker Token(只显示一次,官方原文:"WARNING: This will only be shown once. Save it now!"),形如:
==========================
Trigger.dev Bootstrap - Worker Token
WARNING: This will only be shown once. Save it now!
Worker group:
bootstrap
Token:
tr_wgt_fgfAEjsTmvl4lowBLTbP7Xo563UlnVa206mr9uW6
...
==========================
步骤 4:查看 magic link 登录链接
docker compose logs -f webapp
逐段解释:官方原文:"When logging in, check the container logs for the magic link"——默认未配置邮件服务时,magic link 不会真正发出邮件,而是打印在 webapp 容器日志里。
-f持续跟踪,Ctrl+C退出(不停止容器)。
预期输出参考: 日志中出现形如 https://localhost:8030/magic?token=... 的登录链接。
步骤 5(可选,初始化新项目):
npx trigger.dev@latest init -p <project-ref> -a http://localhost:8030
逐段解释:
npx trigger.dev@latest临时拉取官方 CLI;init在该自托管实例上初始化一个项目;-p <project-ref>指定项目引用名;-a http://localhost:8030指定 API 地址指向本机 webapp。
步骤 6(Worker,分机部署时):
在另一台机器上同样克隆仓库、cp .env.example .env(不要在 worker 上再跑 generate-secrets.sh,官方明确警告会导致 MANAGED_WORKER_SECRET 不一致),把 webapp 启动时打印的 Worker Token 填进 worker 侧 .env:
cd worker
docker compose up -d
逐段解释:worker 容器启动 supervisor,按
TRIGGER_WORKER_TOKEN连到 webapp 领取任务。官方原文:"For a split webapp/worker setup, set MANAGED_WORKER_SECRET on the worker to the same value as the webapp's"。
步骤 7(同机合并部署,官方原命令):
若想 webapp 与 worker 跑在同一台机器,官方原文:
docker compose -f webapp/docker-compose.yml -f worker/docker-compose.yml up -d
逐段解释:用
-f同时加载两份 compose 文件叠加;同机部署时 worker 引导会自动完成,无需手工从日志抄 token。
六、配置参数详解
官方 .env.example 中的关键变量(按官方文档「Authentication」「Registry setup」「Object storage」「Version locking」节摘录):
| 变量 | 默认值 / 示例 | 说明 |
|---|---|---|
EMAIL_TRANSPORT |
(未设置) | 未设置时 magic link 打印到 webapp 日志;可选 resend / smtp / aws-ses |
FROM_EMAIL / REPLY_TO_EMAIL |
- | 发件人地址 |
RESEND_API_KEY |
- | EMAIL_TRANSPORT=resend 时必填 |
SMTP_HOST / SMTP_PORT / SMTP_USER / SMTP_PASSWORD / SMTP_SECURE |
- | SMTP 配置;官方注明 SMTP_SECURE=false 表示用 STARTTLS,并非"不安全" |
AUTH_GITHUB_CLIENT_ID / AUTH_GITHUB_CLIENT_SECRET |
- | GitHub OAuth App;回调 URL 必须为 https://<your_webapp_domain>/auth/github/callback |
WHITELISTED_EMAILS |
- | 正则,命中之外的邮箱禁止注册/登录,对 magic link 与 GitHub OAuth 同时生效 |
ADMIN_EMAILS |
- | 正则,新建用户中命中者自动成为 admin |
MANAGED_WORKER_SECRET |
(generate-secrets.sh 生成) | 分机部署时 webapp 与 worker 必须一致 |
TRIGGER_WORKER_TOKEN |
tr_wgt_... |
首次启动 webapp 打印一次;或用 file:///home/node/shared/worker_token 指向共享卷文件 |
TRIGGER_IMAGE_TAG |
latest | 锁定平台镜像版本,如 v4.5.0;官方注明 4.5.0 是最后一个支持 v3 SDK 任务的版本 |
CLICKHOUSE_IMAGE_TAG |
- | 锁定内置 ClickHouse 版本;官方要求 ClickHouse ≥ 25.8 |
内置 Registry 默认凭据(官方「Registry setup」节):
| 项 | 默认值 |
|---|---|
| Registry 地址 | localhost:5000 |
| Username | registry-user |
| Password | very-secure-indeed |
官方警告:"You should change these before deploying to production, especially the password",改密码需编辑 ./hosting/docker/registry/auth.htpasswd。
内置对象存储默认凭据(官方「Object storage」节):
| 项 | 默认值 |
|---|---|
| Endpoint | http://localhost:9000 |
| Dashboard | http://localhost:9001 |
| Username | admin |
| Password | very-safe-password |
默认 bucket 为 packets;官方建议生产环境建专用子用户而非使用 root 凭据。
七、启动与运维
- 启动:
docker compose up -d(webapp 目录或合并目录)。 - 停止:
docker compose down。 - 查看日志:
docker compose logs -f webapp(看 magic link / 启动错误);docker compose logs -f worker。 - 开机自启: 官方 compose 未在文档中单独声明 restart policy;如需容器随 Docker 守护进程自动拉起,可在 compose 服务中追加
restart: unless-stopped(属 Docker 平台通用机制,非 Trigger.dev 官方文档内容)。 - 修改对外端口: 官方默认 webapp 监听 8030;如需改端口,在 compose 中改
ports映射(如18030:8030),并相应调整npx trigger.dev init -a ...与 OAuth 回调 URL。 - 数据持久化: 官方 compose 内部使用命名卷保存 postgres、redis、clickhouse、registry、对象存储数据;升级前官方警告"keep data safe",对应卷位于
docker volume ls列出的 webapp/worker 项目卷中。 - 登录 registry(每台执行 deploy 的机器):
docker login -u <username> <registry>
逐段解释:官方原文:"You will have to login to the registry on every machine that runs the deploy command"。执行后按提示输入密码。
- 把现有用户提为 admin: 官方说明二选一——新用户设ADMIN_EMAILS环境变量后再注册;老用户直接在数据库 user 表把admin字段置为true。
- 创建额外 worker group(需 admin PAT):
curl -X POST \
"$api_url/admin/api/v1/workers" \
-H "Authorization: Bearer $admin_pat" \
-H "Content-Type: application/json" \
-d "{\"name\": \"$wg_name\"}"
八、实操验证
- 浏览器访问
http://localhost:8030(官方原文:"You should now be able to access the webapp at http://localhost:8030")。 - 在登录页输入邮箱,官方未配置邮件时,magic link 不会发出;执行
docker compose logs -f webapp找到形如https://localhost:8030/magic?token=...的链接,在浏览器打开即登录成功。 - 登录后进入 Dashboard,按
npx trigger.dev@latest init -p <project-ref> -a http://localhost:8030初始化第一个项目。 - 在自己的代码库里写一个最简单的任务并
npx trigger.dev@latest deploy部署;回到 Dashboard 应能看到该 project 与一次 run,点进去能看到完整 trace 视图(对应 README 中的 trace-view 截图)。 - 验证内置对象存储:浏览器打开
http://localhost:9001,用默认admin / very-safe-password登录,应能看到packetsbucket。
登录与安全(重要)
- 官方默认账号密码:无内置用户。 Trigger.dev 自托管没有出厂账号,第一个用户通过 magic link 或 GitHub OAuth 注册;注册的第一个邮箱若命中
ADMIN_EMAILS正则则自动成为 admin。 - 登录地址:
http://localhost:8030。 - magic link: 默认
EMAIL_TRANSPORT未设置时,链接打印在 webapp 容器日志中;生产必须配置EMAIL_TRANSPORT=resend/smtp/aws-ses之一,否则任何人翻日志都能拿到登录链接。 - 修改密码: Trigger.dev 不设传统密码,登录态靠 magic link / OAuth;撤销会话可在 Dashboard 账户设置或数据库层面处理。
- 密码/密钥存放位置: 应用密钥与数据存储口令在
.env文件中(generate-secrets.sh写入);JWT/session 加密密钥由DAGU_*风格的应用密钥管理。官方警告:.env中的加密密钥一旦丢失或被轮转,已加密数据与现有会话将全部失效。 - 安全提醒:
1. 部署后必须立即修改内置 registry 默认口令registry-user / very-secure-indeed与对象存储 root 口令admin / very-safe-password;
2. 生产环境必须配置真实邮件服务(resend/smtp/aws-ses),不要依赖日志里的 magic link;
3. 用WHITELISTED_EMAILS限制可注册邮箱;
4. 官方原文:"This guide alone is unlikely to result in a production-ready deployment. Security, scaling, and reliability concerns are not fully addressed here"——公网部署前请自行加反向代理、TLS、访问控制。
九、故障排查
案例 1:Worker 启动后无法连到 webapp / 认证失败
- 报错原文(常见形式):worker 容器日志出现
unauthorized/authentication failed/ worker 反复重连。 - 报错原因:官方文档明确警告——在分机部署时,如果在 worker 上又跑了一次
generate-secrets.sh,worker 的MANAGED_WORKER_SECRET会与 webapp 不一致;或 webapp 首次启动打印的 Worker Token 没有正确填到 worker 的.env。 - 分步解决:① 在 webapp 主机
cd trigger.dev/hosting/docker/webapp && docker compose logs webapp,找到Trigger.dev Bootstrap - Worker Token段;② 把TRIGGER_WORKER_TOKEN=tr_wgt_...填到 worker 主机.env;③ 确认 worker 上不要再跑./generate-secrets.sh;④cd worker && docker compose down && docker compose up -d重启。
案例 2:访问 8030 看不到 magic link,登录页输入邮箱后无反应
- 报错原因:未配置
EMAIL_TRANSPORT,官方行为是把 magic link 打印到 webapp 日志而不真正发信。 - 分步解决:①
docker compose logs -f webapp翻日志找https://.../magic?token=...;② 生产环境按官方「Authentication」节配置EMAIL_TRANSPORT=smtp及SMTP_HOST/PORT/USER/PASSWORD等;③docker compose up -d重启生效。
案例 3:deploy 任务时 docker login / push 到内置 registry 失败
- 报错原文(常见形式):
docker login: authentication required或denied: requested access to the resource is denied。 - 报错原因:官方「Logging in」节要求每台执行 deploy 的机器都要先
docker login -u <username> <registry>,且默认口令仍是very-secure-indeed。 - 分步解决:① 确认 registry 地址(默认
localhost:5000,分机部署时改成 webapp 主机可达地址);②docker login -u registry-user localhost:5000,密码输入very-secure-indeed(或你改过的口令);③ 生产环境务必编辑./hosting/docker/registry/auth.htpasswd修改默认口令后再对外。
案例 4:自托管后 CLI 报 v3 任务不被支持
- 报错原文(官方文档原文):"4.5.1 and later reject v3 triggers and deploys with an upgrade message"。
- 报错原因:官方说明 Trigger.dev 4.5.0 是最后一个支持 v3 SDK 任务的版本;4.5.1+ 必须迁移到 v4 SDK。
- 分步解决:① 若仍有 v3 任务,在
.env中把TRIGGER_IMAGE_TAG锁到v4.5.0;② 或按官方迁移指南把 SDK 升到 v4 后再用 latest 镜像。
十、升级、回滚与卸载
升级: 官方「Version locking」节说明默认镜像走 latest tag;升级即:
git pull
cd webapp && docker compose pull && docker compose up -d
cd ../worker && docker compose pull && docker compose up -d
逐段解释:
git pull拉取新版 hosting/docker 配置;docker compose pull拉新镜像;docker compose up -d用新镜像重建容器。官方提醒:"We patch the latest released version line only, so keep an eye on new releases to receive security fixes"。升级前务必确认.env中的数据卷已正确挂载,避免数据丢失。
回滚: 官方未提供一键回滚命令;可在 .env 中把 TRIGGER_IMAGE_TAG 改回旧版本号(如 v4.5.0),再 docker compose pull && docker compose up -d。由于 postgres/clickhouse 数据卷独立于镜像,回滚时需自行确认旧镜像与新 schema 是否兼容(官方建议生产升级前先备份数据卷)。
卸载:
cd trigger.dev/hosting/docker
docker compose down # webapp 目录
docker compose down # worker 目录
如需彻底清理数据(永久删除所有任务运行记录、用户、部署产物),再删除命名卷:
docker volume ls | grep -E "webapp|worker" | awk '{print $2}' | xargs -r docker volume rm
注意:官方未在文档中给出"卸载"专章,上述卷清理基于 Docker 平台通用机制,操作前请先备份
.env与数据卷。
十一、商用许可合规说明
- 许可证:Apache License 2.0(官方 README 徽章与仓库 LICENSE 文件明确)。
- Apache-2.0 允许自由使用、修改、分发与商用;分发时须保留版权声明与许可文本,修改过的文件须标注变更,并附带 NOTICE(如有)。
- Trigger.dev 同时提供商业云(cloud.trigger.dev)作为可选托管;自托管 OSS 版本商用无需付费授权。但官方文档提示:"As self-hosted deployments tend to have unique requirements and configurations, we don't provide specific advice for securing your deployment, scaling up, or improving reliability"——生产级安全、高可用、扩容需自行负责或转用其商业云。