347 lines
7.6 KiB
Markdown
347 lines
7.6 KiB
Markdown
# Trigger.dev Configuration (v4)
|
|
|
|
**Complete guide to configuring `trigger.config.ts` with build extensions**
|
|
|
|
## Basic Configuration
|
|
|
|
```ts
|
|
import { defineConfig } from "@trigger.dev/sdk";
|
|
|
|
export default defineConfig({
|
|
project: "<project-ref>", // Required: Your project reference
|
|
dirs: ["./trigger"], // Task directories
|
|
runtime: "node", // "node", "node-22", or "bun"
|
|
logLevel: "info", // "debug", "info", "warn", "error"
|
|
|
|
// Default retry settings
|
|
retries: {
|
|
enabledInDev: false,
|
|
default: {
|
|
maxAttempts: 3,
|
|
minTimeoutInMs: 1000,
|
|
maxTimeoutInMs: 10000,
|
|
factor: 2,
|
|
randomize: true,
|
|
},
|
|
},
|
|
|
|
// Build configuration
|
|
build: {
|
|
autoDetectExternal: true,
|
|
keepNames: true,
|
|
minify: false,
|
|
extensions: [], // Build extensions go here
|
|
},
|
|
|
|
// Global lifecycle hooks
|
|
onStartAttempt: async ({ payload, ctx }) => {
|
|
console.log("Global task start");
|
|
},
|
|
onSuccess: async ({ payload, output, ctx }) => {
|
|
console.log("Global task success");
|
|
},
|
|
onFailure: async ({ payload, error, ctx }) => {
|
|
console.log("Global task failure");
|
|
},
|
|
});
|
|
```
|
|
|
|
## Build Extensions
|
|
|
|
### Database & ORM
|
|
|
|
#### Prisma
|
|
|
|
```ts
|
|
import { prismaExtension } from "@trigger.dev/build/extensions/prisma";
|
|
|
|
extensions: [
|
|
prismaExtension({
|
|
schema: "prisma/schema.prisma",
|
|
version: "5.19.0", // Optional: specify version
|
|
migrate: true, // Run migrations during build
|
|
directUrlEnvVarName: "DIRECT_DATABASE_URL",
|
|
typedSql: true, // Enable TypedSQL support
|
|
}),
|
|
];
|
|
```
|
|
|
|
#### TypeScript Decorators (for TypeORM)
|
|
|
|
```ts
|
|
import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript";
|
|
|
|
extensions: [
|
|
emitDecoratorMetadata(), // Enables decorator metadata
|
|
];
|
|
```
|
|
|
|
### Scripting Languages
|
|
|
|
#### Python
|
|
|
|
```ts
|
|
import { pythonExtension } from "@trigger.dev/build/extensions/python";
|
|
|
|
extensions: [
|
|
pythonExtension({
|
|
scripts: ["./python/**/*.py"], // Copy Python files
|
|
requirementsFile: "./requirements.txt", // Install packages
|
|
devPythonBinaryPath: ".venv/bin/python", // Dev mode binary
|
|
}),
|
|
];
|
|
|
|
// Usage in tasks
|
|
const result = await python.runInline(`print("Hello, world!")`);
|
|
const output = await python.runScript("./python/script.py", ["arg1"]);
|
|
```
|
|
|
|
### Browser Automation
|
|
|
|
#### Playwright
|
|
|
|
```ts
|
|
import { playwright } from "@trigger.dev/build/extensions/playwright";
|
|
|
|
extensions: [
|
|
playwright({
|
|
browsers: ["chromium", "firefox", "webkit"], // Default: ["chromium"]
|
|
headless: true, // Default: true
|
|
}),
|
|
];
|
|
```
|
|
|
|
#### Puppeteer
|
|
|
|
```ts
|
|
import { puppeteer } from "@trigger.dev/build/extensions/puppeteer";
|
|
|
|
extensions: [puppeteer()];
|
|
|
|
// Environment variable needed:
|
|
// PUPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable"
|
|
```
|
|
|
|
#### Lightpanda
|
|
|
|
```ts
|
|
import { lightpanda } from "@trigger.dev/build/extensions/lightpanda";
|
|
|
|
extensions: [
|
|
lightpanda({
|
|
version: "latest", // or "nightly"
|
|
disableTelemetry: false,
|
|
}),
|
|
];
|
|
```
|
|
|
|
### Media Processing
|
|
|
|
#### FFmpeg
|
|
|
|
```ts
|
|
import { ffmpeg } from "@trigger.dev/build/extensions/core";
|
|
|
|
extensions: [
|
|
ffmpeg({ version: "7" }), // Static build, or omit for Debian version
|
|
];
|
|
|
|
// Automatically sets FFMPEG_PATH and FFPROBE_PATH
|
|
// Add fluent-ffmpeg to external packages if using
|
|
```
|
|
|
|
#### Audio Waveform
|
|
|
|
```ts
|
|
import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform";
|
|
|
|
extensions: [
|
|
audioWaveform(), // Installs Audio Waveform 1.1.0
|
|
];
|
|
```
|
|
|
|
### System & Package Management
|
|
|
|
#### System Packages (apt-get)
|
|
|
|
```ts
|
|
import { aptGet } from "@trigger.dev/build/extensions/core";
|
|
|
|
extensions: [
|
|
aptGet({
|
|
packages: ["ffmpeg", "imagemagick", "curl=7.68.0-1"], // Can specify versions
|
|
}),
|
|
];
|
|
```
|
|
|
|
#### Additional NPM Packages
|
|
|
|
Only use this for installing CLI tools, NOT packages you import in your code.
|
|
|
|
```ts
|
|
import { additionalPackages } from "@trigger.dev/build/extensions/core";
|
|
|
|
extensions: [
|
|
additionalPackages({
|
|
packages: ["wrangler"], // CLI tools and specific versions
|
|
}),
|
|
];
|
|
```
|
|
|
|
#### Additional Files
|
|
|
|
```ts
|
|
import { additionalFiles } from "@trigger.dev/build/extensions/core";
|
|
|
|
extensions: [
|
|
additionalFiles({
|
|
files: ["wrangler.toml", "./assets/**", "./fonts/**"], // Glob patterns supported
|
|
}),
|
|
];
|
|
```
|
|
|
|
### Environment & Build Tools
|
|
|
|
#### Environment Variable Sync
|
|
|
|
```ts
|
|
import { syncEnvVars } from "@trigger.dev/build/extensions/core";
|
|
|
|
extensions: [
|
|
syncEnvVars(async (ctx) => {
|
|
// ctx contains: environment, projectRef, env
|
|
return [
|
|
{ name: "SECRET_KEY", value: await getSecret(ctx.environment) },
|
|
{ name: "API_URL", value: ctx.environment === "prod" ? "api.prod.com" : "api.dev.com" },
|
|
];
|
|
}),
|
|
];
|
|
```
|
|
|
|
#### ESBuild Plugins
|
|
|
|
```ts
|
|
import { esbuildPlugin } from "@trigger.dev/build/extensions";
|
|
import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin";
|
|
|
|
extensions: [
|
|
esbuildPlugin(
|
|
sentryEsbuildPlugin({
|
|
org: process.env.SENTRY_ORG,
|
|
project: process.env.SENTRY_PROJECT,
|
|
authToken: process.env.SENTRY_AUTH_TOKEN,
|
|
}),
|
|
{ placement: "last", target: "deploy" } // Optional config
|
|
),
|
|
];
|
|
```
|
|
|
|
## Custom Build Extensions
|
|
|
|
```ts
|
|
import { defineConfig } from "@trigger.dev/sdk";
|
|
|
|
const customExtension = {
|
|
name: "my-custom-extension",
|
|
|
|
externalsForTarget: (target) => {
|
|
return ["some-native-module"]; // Add external dependencies
|
|
},
|
|
|
|
onBuildStart: async (context) => {
|
|
console.log(`Build starting for ${context.target}`);
|
|
// Register esbuild plugins, modify build context
|
|
},
|
|
|
|
onBuildComplete: async (context, manifest) => {
|
|
console.log("Build complete, adding layers");
|
|
// Add build layers, modify deployment
|
|
context.addLayer({
|
|
id: "my-layer",
|
|
files: [{ source: "./custom-file", destination: "/app/custom" }],
|
|
commands: ["chmod +x /app/custom"],
|
|
});
|
|
},
|
|
};
|
|
|
|
export default defineConfig({
|
|
project: "my-project",
|
|
build: {
|
|
extensions: [customExtension],
|
|
},
|
|
});
|
|
```
|
|
|
|
## Advanced Configuration
|
|
|
|
### Telemetry
|
|
|
|
```ts
|
|
import { PrismaInstrumentation } from "@prisma/instrumentation";
|
|
import { OpenAIInstrumentation } from "@langfuse/openai";
|
|
|
|
export default defineConfig({
|
|
// ... other config
|
|
telemetry: {
|
|
instrumentations: [new PrismaInstrumentation(), new OpenAIInstrumentation()],
|
|
exporters: [customExporter], // Optional custom exporters
|
|
},
|
|
});
|
|
```
|
|
|
|
### Machine & Performance
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
// ... other config
|
|
defaultMachine: "large-1x", // Default machine for all tasks
|
|
maxDuration: 300, // Default max duration (seconds)
|
|
enableConsoleLogging: true, // Console logging in development
|
|
});
|
|
```
|
|
|
|
## Common Extension Combinations
|
|
|
|
### Full-Stack Web App
|
|
|
|
```ts
|
|
extensions: [
|
|
prismaExtension({ schema: "prisma/schema.prisma", migrate: true }),
|
|
additionalFiles({ files: ["./public/**", "./assets/**"] }),
|
|
syncEnvVars(async (ctx) => [...envVars]),
|
|
];
|
|
```
|
|
|
|
### AI/ML Processing
|
|
|
|
```ts
|
|
extensions: [
|
|
pythonExtension({
|
|
scripts: ["./ai/**/*.py"],
|
|
requirementsFile: "./requirements.txt",
|
|
}),
|
|
ffmpeg({ version: "7" }),
|
|
additionalPackages({ packages: ["wrangler"] }),
|
|
];
|
|
```
|
|
|
|
### Web Scraping
|
|
|
|
```ts
|
|
extensions: [
|
|
playwright({ browsers: ["chromium"] }),
|
|
puppeteer(),
|
|
additionalFiles({ files: ["./selectors.json", "./proxies.txt"] }),
|
|
];
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
- **Use specific versions**: Pin extension versions for reproducible builds
|
|
- **External packages**: Add modules with native addons to the `build.external` array
|
|
- **Environment sync**: Use `syncEnvVars` for dynamic secrets
|
|
- **File paths**: Use glob patterns for flexible file inclusion
|
|
- **Debug builds**: Use `--log-level debug --dry-run` for troubleshooting
|
|
|
|
Extensions only affect deployment, not local development. Use `external` array for packages that shouldn't be bundled.
|