From 6f774f09186d8e8220ff0edce8636d5247c78e2d Mon Sep 17 00:00:00 2001 From: digitalbase Date: Sun, 15 Mar 2026 18:21:44 +0100 Subject: [PATCH] feat: add Trigger.dev v4 template --- .../triggerdotdev-v4/docker-compose.yml | 245 ++++++++++++++++++ blueprints/triggerdotdev-v4/template.yml | 63 +++++ .../triggerdotdev-v4/triggerdotdev-v4.svg | 11 + meta.json | 17 ++ 4 files changed, 336 insertions(+) create mode 100644 blueprints/triggerdotdev-v4/docker-compose.yml create mode 100644 blueprints/triggerdotdev-v4/template.yml create mode 100644 blueprints/triggerdotdev-v4/triggerdotdev-v4.svg diff --git a/blueprints/triggerdotdev-v4/docker-compose.yml b/blueprints/triggerdotdev-v4/docker-compose.yml new file mode 100644 index 00000000..17f1854a --- /dev/null +++ b/blueprints/triggerdotdev-v4/docker-compose.yml @@ -0,0 +1,245 @@ +services: + registry-init: + image: httpd:alpine + restart: "no" + volumes: + - registry-auth:/auth + environment: + REGISTRY_USERNAME: ${REGISTRY_USERNAME:-trigger} + REGISTRY_PASSWORD: ${REGISTRY_PASSWORD} + command: > + sh -c " + if [ ! -f /auth/htpasswd ]; then + htpasswd -Bbc /auth/htpasswd $$REGISTRY_USERNAME $$REGISTRY_PASSWORD; + fi + " + + trigger: + image: ghcr.io/triggerdotdev/trigger.dev:${TRIGGER_IMAGE_TAG:-main} + restart: unless-stopped + depends_on: + - postgres + - redis + - clickhouse + - electric + - minio + - registry + user: root + command: sh -c "chown -R node:node /home/node/shared && exec ./scripts/entrypoint.sh" + environment: + REMIX_APP_PORT: 3000 + APP_ORIGIN: https://${TRIGGER_DOMAIN} + LOGIN_ORIGIN: https://${TRIGGER_DOMAIN} + API_ORIGIN: https://${TRIGGER_DOMAIN} + SESSION_SECRET: ${SESSION_SECRET} + MAGIC_LINK_SECRET: ${MAGIC_LINK_SECRET} + ENCRYPTION_KEY: ${ENCRYPTION_KEY} + MANAGED_WORKER_SECRET: ${MANAGED_WORKER_SECRET} + DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-trigger}?schema=public&sslmode=disable + DIRECT_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-trigger}?schema=public&sslmode=disable + REDIS_HOST: redis + REDIS_PORT: 6379 + REDIS_TLS_DISABLED: "true" + ELECTRIC_ORIGIN: http://electric:3000 + DEV_OTEL_EXPORTER_OTLP_ENDPOINT: https://${TRIGGER_DOMAIN}/otel + DEPLOY_REGISTRY_HOST: ${REGISTRY_DOMAIN} + DEPLOY_REGISTRY_NAMESPACE: ${REGISTRY_NAMESPACE:-trigger} + DEPLOY_REGISTRY_USERNAME: ${REGISTRY_USERNAME:-trigger} + DEPLOY_REGISTRY_PASSWORD: ${REGISTRY_PASSWORD} + OBJECT_STORE_BASE_URL: http://minio:9000 + OBJECT_STORE_ACCESS_KEY_ID: admin + OBJECT_STORE_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD} + GRACEFUL_SHUTDOWN_TIMEOUT: 1000 + NODE_MAX_OLD_SPACE_SIZE: ${NODE_MAX_OLD_SPACE_SIZE:-1024} + TRIGGER_BOOTSTRAP_ENABLED: "1" + TRIGGER_BOOTSTRAP_WORKER_GROUP_NAME: bootstrap + TRIGGER_BOOTSTRAP_WORKER_TOKEN_PATH: /home/node/shared/worker_token + CLICKHOUSE_URL: http://${CLICKHOUSE_ADMIN_USER:-default}:${CLICKHOUSE_ADMIN_PASSWORD}@clickhouse:8123?secure=false + CLICKHOUSE_LOG_LEVEL: info + INTERNAL_OTEL_TRACE_LOGGING_ENABLED: "0" + RUN_REPLICATION_ENABLED: "1" + RUN_REPLICATION_CLICKHOUSE_URL: http://${CLICKHOUSE_ADMIN_USER:-default}:${CLICKHOUSE_ADMIN_PASSWORD}@clickhouse:8123 + RUN_REPLICATION_LOG_LEVEL: info + APP_LOG_LEVEL: info + TRIGGER_TELEMETRY_DISABLED: "0" + WHITELISTED_EMAILS: ${WHITELISTED_EMAILS:-} + ADMIN_EMAILS: ${ADMIN_EMAILS:-} + DEFAULT_ENV_EXECUTION_CONCURRENCY_LIMIT: ${DEFAULT_ENV_EXECUTION_CONCURRENCY_LIMIT:-100} + DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT: ${DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT:-300} + DEV_MAX_CONCURRENT_RUNS: ${DEV_MAX_CONCURRENT_RUNS:-25} + WORKER_CONCURRENCY: ${WORKER_CONCURRENCY:-10} + WORKER_POLL_INTERVAL: ${WORKER_POLL_INTERVAL:-1000} + TASK_PAYLOAD_OFFLOAD_THRESHOLD: ${TASK_PAYLOAD_OFFLOAD_THRESHOLD:-524288} + TASK_PAYLOAD_MAXIMUM_SIZE: ${TASK_PAYLOAD_MAXIMUM_SIZE:-3145728} + BATCH_TASK_PAYLOAD_MAXIMUM_SIZE: ${BATCH_TASK_PAYLOAD_MAXIMUM_SIZE:-1000000} + TASK_RUN_METADATA_MAXIMUM_SIZE: ${TASK_RUN_METADATA_MAXIMUM_SIZE:-262144} + REALTIME_STREAM_MAX_LENGTH: ${REALTIME_STREAM_MAX_LENGTH:-1000} + REALTIME_STREAM_TTL: ${REALTIME_STREAM_TTL:-86400} + volumes: + - shared-data:/home/node/shared + healthcheck: + test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/healthcheck',(r)=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + + postgres: + image: postgres:14 + restart: unless-stopped + command: ["-c", "wal_level=logical"] + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB:-trigger} + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready", "-U", "postgres"] + interval: 5s + timeout: 20s + retries: 10 + start_period: 10s + + redis: + image: redis:7 + restart: unless-stopped + volumes: + - redis-data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + electric: + image: electricsql/electric:1.2.4 + restart: unless-stopped + depends_on: + - postgres + environment: + DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-trigger}?schema=public&sslmode=disable + ELECTRIC_INSECURE: "true" + ELECTRIC_USAGE_REPORTING: "false" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/v1/health"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + clickhouse: + image: bitnamilegacy/clickhouse:latest + restart: unless-stopped + environment: + CLICKHOUSE_ADMIN_USER: ${CLICKHOUSE_ADMIN_USER:-default} + CLICKHOUSE_ADMIN_PASSWORD: ${CLICKHOUSE_ADMIN_PASSWORD} + volumes: + - clickhouse-data:/bitnami/clickhouse + - ../files/clickhouse/override.xml:/bitnami/clickhouse/etc/config.d/override.xml:ro + healthcheck: + test: ["CMD", "clickhouse-client", "--host", "localhost", "--port", "9000", "--user", "${CLICKHOUSE_ADMIN_USER:-default}", "--password", "${CLICKHOUSE_ADMIN_PASSWORD}", "--query", "SELECT 1"] + interval: 5s + timeout: 5s + retries: 5 + start_period: 10s + + registry: + image: registry:2 + restart: unless-stopped + depends_on: + registry-init: + condition: service_completed_successfully + volumes: + - registry-auth:/auth:ro + - registry-data:/var/lib/registry + environment: + REGISTRY_AUTH: htpasswd + REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm + REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd + healthcheck: + test: ["CMD", "wget", "--spider", "-q", "http://localhost:5000/"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + minio: + image: bitnamilegacy/minio:latest + restart: unless-stopped + environment: + MINIO_ROOT_USER: admin + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + MINIO_DEFAULT_BUCKETS: packets + MINIO_BROWSER: "on" + volumes: + - minio-data:/bitnami/minio/data + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 5s + timeout: 10s + retries: 5 + start_period: 10s + + supervisor: + image: ghcr.io/triggerdotdev/supervisor:${TRIGGER_IMAGE_TAG:-main} + restart: unless-stopped + depends_on: + - docker-proxy + - trigger + user: root + command: sh -c "chown -R node:node /home/node/shared && exec /usr/bin/dumb-init -- pnpm run --filter supervisor start" + environment: + TRIGGER_API_URL: http://trigger:3000 + OTEL_EXPORTER_OTLP_ENDPOINT: http://trigger:3000/otel + TRIGGER_WORKER_TOKEN: file:///home/node/shared/worker_token + MANAGED_WORKER_SECRET: ${MANAGED_WORKER_SECRET} + TRIGGER_WORKLOAD_API_DOMAIN: supervisor + TRIGGER_WORKLOAD_API_PORT_EXTERNAL: 8020 + DOCKER_HOST: tcp://docker-proxy:2375 + DOCKER_RUNNER_NETWORKS: ${DOCKER_RUNNER_NETWORKS} + DOCKER_AUTOREMOVE_EXITED_CONTAINERS: ${DOCKER_AUTOREMOVE_EXITED_CONTAINERS:-0} + DOCKER_REGISTRY_URL: https://${REGISTRY_DOMAIN} + DOCKER_REGISTRY_USERNAME: ${REGISTRY_USERNAME:-trigger} + DOCKER_REGISTRY_PASSWORD: ${REGISTRY_PASSWORD} + DEBUG: "1" + ENFORCE_MACHINE_PRESETS: "1" + TRIGGER_DEQUEUE_INTERVAL_MS: 1000 + volumes: + - shared-data:/home/node/shared + - /var/run/docker.sock:/var/run/docker.sock + healthcheck: + test: ["CMD", "node", "-e", "require('http').get('http://localhost:8020/health', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 10s + + docker-proxy: + image: tecnativa/docker-socket-proxy:latest + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + LOG_LEVEL: info + POST: "1" + CONTAINERS: "1" + IMAGES: "1" + INFO: "1" + NETWORKS: "1" + healthcheck: + test: ["CMD", "nc", "-z", "127.0.0.1", "2375"] + interval: 30s + timeout: 5s + retries: 5 + start_period: 5s + +volumes: + postgres-data: + redis-data: + clickhouse-data: + minio-data: + shared-data: + registry-data: + registry-auth: diff --git a/blueprints/triggerdotdev-v4/template.yml b/blueprints/triggerdotdev-v4/template.yml new file mode 100644 index 00000000..6ebf3c5c --- /dev/null +++ b/blueprints/triggerdotdev-v4/template.yml @@ -0,0 +1,63 @@ +variables: + main_domain: ${domain} + registry_domain: ${domain} + trigger_image_tag: main + postgres_db: trigger + postgres_password: ${password:32} + session_secret: ${base64:32} + magic_link_secret: ${base64:32} + encryption_key: ${base64:32} + managed_worker_secret: ${base64:32} + minio_root_password: ${password:32} + registry_username: trigger + registry_password: ${password:32} + registry_namespace: trigger + clickhouse_admin_user: default + clickhouse_admin_password: ${password:32} + docker_runner_networks: set-after-first-deploy + +config: + domains: + - serviceName: trigger + port: 3000 + host: ${main_domain} + - serviceName: registry + port: 5000 + host: ${registry_domain} + + env: + TRIGGER_DOMAIN: ${main_domain} + REGISTRY_DOMAIN: ${registry_domain} + TRIGGER_IMAGE_TAG: ${trigger_image_tag} + POSTGRES_DB: ${postgres_db} + POSTGRES_PASSWORD: ${postgres_password} + SESSION_SECRET: ${session_secret} + MAGIC_LINK_SECRET: ${magic_link_secret} + ENCRYPTION_KEY: ${encryption_key} + MANAGED_WORKER_SECRET: ${managed_worker_secret} + MINIO_ROOT_PASSWORD: ${minio_root_password} + REGISTRY_USERNAME: ${registry_username} + REGISTRY_PASSWORD: ${registry_password} + REGISTRY_NAMESPACE: ${registry_namespace} + CLICKHOUSE_ADMIN_USER: ${clickhouse_admin_user} + CLICKHOUSE_ADMIN_PASSWORD: ${clickhouse_admin_password} + DOCKER_RUNNER_NETWORKS: ${docker_runner_networks} + + mounts: + - filePath: /clickhouse/override.xml + content: | + + + warning + + 524288000 + 1 + + + 8192 + 1 + 0 + 0 + + + diff --git a/blueprints/triggerdotdev-v4/triggerdotdev-v4.svg b/blueprints/triggerdotdev-v4/triggerdotdev-v4.svg new file mode 100644 index 00000000..b652117a --- /dev/null +++ b/blueprints/triggerdotdev-v4/triggerdotdev-v4.svg @@ -0,0 +1,11 @@ + + + + + + + + + + Trigger.dev v4 + diff --git a/meta.json b/meta.json index 3ae0cb5e..171ca6ae 100644 --- a/meta.json +++ b/meta.json @@ -6178,6 +6178,23 @@ "applications" ] }, + { + "id": "triggerdotdev-v4", + "name": "Trigger.dev v4", + "version": "main", + "description": "Trigger.dev v4 template with PostgreSQL, Redis, ElectricSQL, ClickHouse, MinIO, and private Docker registry.", + "logo": "triggerdotdev-v4.svg", + "links": { + "github": "https://github.com/triggerdotdev/trigger.dev", + "website": "https://trigger.dev/", + "docs": "https://trigger.dev/docs" + }, + "tags": [ + "event-driven", + "automation", + "workflows" + ] + }, { "id": "trilium", "name": "Trilium",