Skip to content

Commit 47b19a4

Browse files
authored
A few small v4 fixes (#2153)
* remove unused env vars * actually use ALERT_REPLY_TO_EMAIL for alerts (non-breaking) * increase fallback branch limit to 100M * more unused env vars and example * hide usage page when self-hosted * fix for init flow * set default or concurrency to 300 to match 100 on env * fail fast when registry env vars are empty strings
1 parent 5301239 commit 47b19a4

File tree

9 files changed

+44
-97
lines changed

9 files changed

+44
-97
lines changed

.changeset/light-peas-melt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"trigger.dev": patch
3+
---
4+
5+
Fix update command version range handling

.env.example

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ APP_ENV=development
1212
APP_ORIGIN=http://localhost:3030
1313
ELECTRIC_ORIGIN=http://localhost:3060
1414
NODE_ENV=development
15-
V3_ENABLED=true
1615

1716
# Redis is used for the v3 queuing and v2 concurrency control
1817
REDIS_HOST="localhost"
@@ -22,6 +21,9 @@ REDIS_TLS_DISABLED="true"
2221
DEV_OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:3030/otel"
2322
DEV_OTEL_BATCH_PROCESSING_ENABLED="0"
2423

24+
# When the domain is set to `localhost` the CLI deploy command will only --load the image by default and not --push it
25+
DEPLOY_REGISTRY_HOST=localhost:5000
26+
2527
# OPTIONAL VARIABLES
2628
# This is used for validating emails that are allowed to log in. Every email that do not match this regex will be rejected.
2729
# WHITELISTED_EMAILS="authorized@yahoo\.com|authorized@gmail\.com"
@@ -60,29 +62,11 @@ DEV_OTEL_BATCH_PROCESSING_ENABLED="0"
6062
# FROM_EMAIL=
6163
# REPLY_TO_EMAIL=
6264

63-
# Remove the following line to enable logging telemetry traces to the console
64-
LOG_TELEMETRY="false"
65-
6665
# CLOUD VARIABLES
6766
POSTHOG_PROJECT_KEY=
68-
PLAIN_API_KEY=
69-
CLOUD_AIRTABLE_CLIENT_ID=
70-
CLOUD_AIRTABLE_CLIENT_SECRET=
71-
CLOUD_GITHUB_CLIENT_ID=
72-
CLOUD_GITHUB_CLIENT_SECRET=
73-
CLOUD_LINEAR_CLIENT_ID=
74-
CLOUD_LINEAR_CLIENT_SECRET=
75-
CLOUD_SLACK_APP_HOST=
76-
CLOUD_SLACK_CLIENT_ID=
77-
CLOUD_SLACK_CLIENT_SECRET=
78-
79-
# v3 variables
80-
PROVIDER_SECRET=provider-secret # generate the actual secret with `openssl rand -hex 32`
81-
COORDINATOR_SECRET=coordinator-secret # generate the actual secret with `openssl rand -hex 32`
8267

8368
# DEPOT_ORG_ID=<Depot org id>
8469
# DEPOT_TOKEN=<Depot org token>
85-
DEPLOY_REGISTRY_HOST=localhost:5000 # This is the host that the deploy CLI will use to push images to the registry
8670
# DEV_OTEL_EXPORTER_OTLP_ENDPOINT="http://0.0.0.0:4318"
8771
# These are needed for the object store (for handling large payloads/outputs)
8872
# OBJECT_STORE_BASE_URL="https://{bucket}.{accountId}.r2.cloudflarestorage.com"
@@ -92,8 +76,5 @@ DEPLOY_REGISTRY_HOST=localhost:5000 # This is the host that the deploy CLI will
9276

9377
# These control the server-side internal telemetry
9478
# INTERNAL_OTEL_TRACE_EXPORTER_URL=<URL to send traces to>
95-
# INTERNAL_OTEL_TRACE_EXPORTER_AUTH_HEADER_NAME=<Header name for the auth token>
96-
# INTERNAL_OTEL_TRACE_EXPORTER_AUTH_HEADER_VALUE=<Auth token value>
9779
# INTERNAL_OTEL_TRACE_LOGGING_ENABLED=1
98-
# INTERNAL_OTEL_TRACE_SAMPING_RATE=20 # this means 1/20 traces or 5% of traces will be sampled (sampled = recorded)
9980
# INTERNAL_OTEL_TRACE_INSTRUMENT_PRISMA_ENABLED=0,

apps/webapp/app/components/navigation/OrganizationSettingsSideMenu.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@ export function OrganizationSettingsSideMenu({
6666
<div className="mb-1">
6767
<SideMenuHeader title="Organization" />
6868
</div>
69-
<SideMenuItem
70-
name="Usage"
71-
icon={ChartBarIcon}
72-
activeIconColor="text-indigo-500"
73-
to={v3UsagePath(organization)}
74-
data-action="usage"
75-
/>
69+
{isManagedCloud && (
70+
<SideMenuItem
71+
name="Usage"
72+
icon={ChartBarIcon}
73+
activeIconColor="text-indigo-500"
74+
to={v3UsagePath(organization)}
75+
data-action="usage"
76+
/>
77+
)}
7678
{isManagedCloud && (
7779
<SideMenuItem
7880
name="Billing"

apps/webapp/app/components/navigation/SideMenu.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import { SideMenuItem } from "./SideMenuItem";
8787
import { SideMenuSection } from "./SideMenuSection";
8888
import { BranchEnvironmentIconSmall } from "~/assets/icons/EnvironmentIcons";
8989
import { V4Badge } from "../V4Badge";
90+
import { useFeatures } from "~/hooks/useFeatures";
9091

9192
type SideMenuUser = Pick<User, "email" | "admin"> & { isImpersonating: boolean };
9293
export type SideMenuProject = Pick<
@@ -342,6 +343,7 @@ function ProjectSelector({
342343
const currentPlan = useCurrentPlan();
343344
const [isOrgMenuOpen, setOrgMenuOpen] = useState(false);
344345
const navigation = useNavigation();
346+
const { isManagedCloud } = useFeatures();
345347

346348
let plan: string | undefined = undefined;
347349
if (currentPlan?.v3Subscription?.isPaying === false) {
@@ -410,16 +412,18 @@ function ProjectSelector({
410412
<CogIcon className="size-4 text-text-dimmed" />
411413
<span className="text-text-bright">Settings</span>
412414
</LinkButton>
413-
<LinkButton
414-
variant="secondary/small"
415-
to={v3UsagePath(organization)}
416-
fullWidth
417-
iconSpacing="gap-1.5"
418-
className="group-hover/button:border-charcoal-500"
419-
>
420-
<ChartBarIcon className="size-4 text-text-dimmed" />
421-
<span className="text-text-bright">Usage</span>
422-
</LinkButton>
415+
{isManagedCloud && (
416+
<LinkButton
417+
variant="secondary/small"
418+
to={v3UsagePath(organization)}
419+
fullWidth
420+
iconSpacing="gap-1.5"
421+
className="group-hover/button:border-charcoal-500"
422+
>
423+
<ChartBarIcon className="size-4 text-text-dimmed" />
424+
<span className="text-text-bright">Usage</span>
425+
</LinkButton>
426+
)}
423427
</div>
424428
</div>
425429
<div className="flex flex-col gap-1 p-1">

apps/webapp/app/env.server.ts

Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { z } from "zod";
2-
import { SecretStoreOptionsSchema } from "./services/secrets/secretStoreOptionsSchema.server";
32
import { isValidDatabaseUrl } from "./utils/db";
43
import { isValidRegex } from "./utils/regex";
54
import { BoolEnv } from "./utils/boolEnv";
@@ -38,10 +37,7 @@ const EnvironmentSchema = z.object({
3837
ELECTRIC_ORIGIN: z.string().default("http://localhost:3060"),
3938
APP_ENV: z.string().default(process.env.NODE_ENV),
4039
SERVICE_NAME: z.string().default("trigger.dev webapp"),
41-
SECRET_STORE: SecretStoreOptionsSchema.default("DATABASE"),
4240
POSTHOG_PROJECT_KEY: z.string().default("phc_LFH7kJiGhdIlnO22hTAKgHpaKhpM8gkzWAFvHmf5vfS"),
43-
TELEMETRY_TRIGGER_API_KEY: z.string().optional(),
44-
TELEMETRY_TRIGGER_API_URL: z.string().optional(),
4541
TRIGGER_TELEMETRY_DISABLED: z.string().optional(),
4642
AUTH_GITHUB_CLIENT_ID: z.string().optional(),
4743
AUTH_GITHUB_CLIENT_SECRET: z.string().optional(),
@@ -56,30 +52,11 @@ const EnvironmentSchema = z.object({
5652
SMTP_PASSWORD: z.string().optional(),
5753

5854
PLAIN_API_KEY: z.string().optional(),
59-
RUNTIME_PLATFORM: z.enum(["docker-compose", "ecs", "local"]).default("local"),
6055
WORKER_SCHEMA: z.string().default("graphile_worker"),
6156
WORKER_CONCURRENCY: z.coerce.number().int().default(10),
6257
WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
63-
/** The number of days a failed Graphile task should stay before getting cleaned up */
64-
WORKER_CLEANUP_TTL_DAYS: z.coerce.number().int().default(3),
65-
EXECUTION_WORKER_CONCURRENCY: z.coerce.number().int().default(10),
66-
EXECUTION_WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
6758
WORKER_ENABLED: z.string().default("true"),
68-
EXECUTION_WORKER_ENABLED: z.string().default("true"),
69-
TASK_OPERATION_WORKER_ENABLED: z.string().default("true"),
70-
TASK_OPERATION_WORKER_CONCURRENCY: z.coerce.number().int().default(10),
71-
TASK_OPERATION_WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
7259
GRACEFUL_SHUTDOWN_TIMEOUT: z.coerce.number().int().default(60000),
73-
/** Optional. Only used if you use the apps/proxy */
74-
AWS_SQS_REGION: z.string().optional(),
75-
/** Optional. Only used if you use the apps/proxy */
76-
AWS_SQS_ACCESS_KEY_ID: z.string().optional(),
77-
/** Optional. Only used if you use the apps/proxy */
78-
AWS_SQS_SECRET_ACCESS_KEY: z.string().optional(),
79-
/** Optional. Only used if you use the apps/proxy */
80-
AWS_SQS_QUEUE_URL: z.string().optional(),
81-
AWS_SQS_BATCH_SIZE: z.coerce.number().int().optional().default(1),
82-
AWS_SQS_WAIT_TIME_MS: z.coerce.number().int().optional().default(100),
8360
DISABLE_SSE: z.string().optional(),
8461
OPENAI_API_KEY: z.string().optional(),
8562

@@ -215,12 +192,9 @@ const EnvironmentSchema = z.object({
215192
PUBSUB_REDIS_CLUSTER_MODE_ENABLED: z.string().default("0"),
216193

217194
DEFAULT_ENV_EXECUTION_CONCURRENCY_LIMIT: z.coerce.number().int().default(100),
218-
DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT: z.coerce.number().int().default(100),
195+
DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT: z.coerce.number().int().default(300),
219196
DEFAULT_DEV_ENV_EXECUTION_ATTEMPTS: z.coerce.number().int().positive().default(1),
220197

221-
TUNNEL_HOST: z.string().optional(),
222-
TUNNEL_SECRET_KEY: z.string().optional(),
223-
224198
//API Rate limiting
225199
/**
226200
* @example "60s"
@@ -240,35 +214,16 @@ const EnvironmentSchema = z.object({
240214
API_RATE_LIMIT_JWT_WINDOW: z.string().default("1m"),
241215
API_RATE_LIMIT_JWT_TOKENS: z.coerce.number().int().default(60),
242216

243-
//Realtime rate limiting
244-
/**
245-
* @example "60s"
246-
* @example "1m"
247-
* @example "1h"
248-
* @example "1d"
249-
* @example "1000ms"
250-
* @example "1000s"
251-
*/
252-
REALTIME_RATE_LIMIT_WINDOW: z.string().default("1m"),
253-
REALTIME_RATE_LIMIT_TOKENS: z.coerce.number().int().default(100),
254-
REALTIME_RATE_LIMIT_REQUEST_LOGS_ENABLED: z.string().default("0"),
255-
REALTIME_RATE_LIMIT_REJECTION_LOGS_ENABLED: z.string().default("1"),
256-
REALTIME_RATE_LIMIT_LIMITER_LOGS_ENABLED: z.string().default("0"),
257-
258-
//Ingesting event rate limit
259-
INGEST_EVENT_RATE_LIMIT_WINDOW: z.string().default("60s"),
260-
INGEST_EVENT_RATE_LIMIT_MAX: z.coerce.number().int().optional(),
261-
262217
//v3
263218
PROVIDER_SECRET: z.string().default("provider-secret"),
264219
COORDINATOR_SECRET: z.string().default("coordinator-secret"),
265220
DEPOT_TOKEN: z.string().optional(),
266221
DEPOT_ORG_ID: z.string().optional(),
267222
DEPOT_REGION: z.string().default("us-east-1"),
268-
DEPLOY_REGISTRY_HOST: z.string(),
223+
DEPLOY_REGISTRY_HOST: z.string().min(1),
269224
DEPLOY_REGISTRY_USERNAME: z.string().optional(),
270225
DEPLOY_REGISTRY_PASSWORD: z.string().optional(),
271-
DEPLOY_REGISTRY_NAMESPACE: z.string().default("trigger"),
226+
DEPLOY_REGISTRY_NAMESPACE: z.string().min(1).default("trigger"),
272227
DEPLOY_IMAGE_PLATFORM: z.string().default("linux/amd64"),
273228
DEPLOY_TIMEOUT_MS: z.coerce
274229
.number()
@@ -377,8 +332,6 @@ const EnvironmentSchema = z.object({
377332
.default(process.env.REDIS_TLS_DISABLED ?? "false"),
378333
ALERT_RATE_LIMITER_REDIS_CLUSTER_MODE_ENABLED: z.string().default("0"),
379334

380-
MAX_SEQUENTIAL_INDEX_FAILURE_COUNT: z.coerce.number().default(96),
381-
382335
LOOPS_API_KEY: z.string().optional(),
383336
MARQS_DISABLE_REBALANCING: BoolEnv.default(false),
384337
MARQS_VISIBILITY_TIMEOUT_MS: z.coerce
@@ -415,12 +368,8 @@ const EnvironmentSchema = z.object({
415368
USAGE_EVENT_URL: z.string().optional(),
416369
PROD_USAGE_HEARTBEAT_INTERVAL_MS: z.coerce.number().int().optional(),
417370

418-
CENTS_PER_VCPU_SECOND: z.coerce.number().default(0),
419-
CENTS_PER_GB_RAM_SECOND: z.coerce.number().default(0),
420371
CENTS_PER_RUN: z.coerce.number().default(0),
421372

422-
USAGE_OPEN_METER_API_KEY: z.string().optional(),
423-
USAGE_OPEN_METER_BASE_URL: z.string().optional(),
424373
EVENT_LOOP_MONITOR_ENABLED: z.string().default("1"),
425374
MAXIMUM_LIVE_RELOADING_EVENTS: z.coerce.number().int().default(1000),
426375
MAXIMUM_TRACE_SUMMARY_VIEW_COUNT: z.coerce.number().int().default(25_000),

apps/webapp/app/services/email.server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ const alertsClient = singleton(
2727
transport: buildTransportOptions(true),
2828
imagesBaseUrl: env.APP_ORIGIN,
2929
from: env.ALERT_FROM_EMAIL ?? "noreply@alerts.trigger.dev",
30-
replyTo: env.REPLY_TO_EMAIL ?? "help@email.trigger.dev",
30+
// Fallback to `REPLY_TO_EMAIL` for backwards compat
31+
replyTo: env.ALERT_REPLY_TO_EMAIL ?? env.REPLY_TO_EMAIL ?? "help@email.trigger.dev",
3132
})
3233
);
3334

apps/webapp/app/services/upsertBranch.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export async function checkBranchLimit(
165165
const count = newBranchName
166166
? usedEnvs.filter((env) => env.branchName !== newBranchName).length
167167
: usedEnvs.length;
168-
const limit = await getLimit(organizationId, "branches", 50);
168+
const limit = await getLimit(organizationId, "branches", 100_000_000);
169169

170170
return {
171171
used: count,

docker/services-compose.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ services:
4141
REMIX_APP_PORT: 3030
4242
PORT: 3030
4343
WORKER_ENABLED: "false"
44-
EXECUTION_WORKER_ENABLED: "false"
4544
networks:
4645
- app_network
4746
worker:

packages/cli-v3/src/commands/update.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,13 @@ export async function updateTriggerPackages(
113113
}
114114

115115
const isDowngrade = mismatches.some((dep) => {
116-
return semver.gt(dep.version, targetVersion);
116+
const depMinVersion = semver.minVersion(dep.version);
117+
118+
if (!depMinVersion) {
119+
return false;
120+
}
121+
122+
return semver.gt(depMinVersion, targetVersion);
117123
});
118124

119125
return {

0 commit comments

Comments
 (0)