From e79a3d9389d28ea3b334eabce72c513dc26f7297 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 12 Mar 2026 18:08:02 -0700 Subject: [PATCH] Add Railway Caddy frontend images --- foundry/docker/frontend-caddy-entrypoint.sh | 16 +++++++++++ foundry/docker/frontend.Caddyfile | 11 ++++++++ foundry/docker/frontend.Dockerfile | 30 +++++++++++++++++++++ foundry/docker/frontend.mock.Dockerfile | 30 +++++++++++++++++++++ foundry/packages/frontend/index.html | 1 + foundry/packages/frontend/src/lib/env.ts | 23 +++++++++++++--- 6 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 foundry/docker/frontend-caddy-entrypoint.sh create mode 100644 foundry/docker/frontend.Caddyfile create mode 100644 foundry/docker/frontend.Dockerfile create mode 100644 foundry/docker/frontend.mock.Dockerfile diff --git a/foundry/docker/frontend-caddy-entrypoint.sh b/foundry/docker/frontend-caddy-entrypoint.sh new file mode 100644 index 0000000..db98b94 --- /dev/null +++ b/foundry/docker/frontend-caddy-entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/sh +set -eu + +escape_js() { + printf '%s' "${1:-}" | sed 's/\\/\\\\/g; s/"/\\"/g' +} + +cat > /srv/__foundry_runtime_config.js <
+ diff --git a/foundry/packages/frontend/src/lib/env.ts b/foundry/packages/frontend/src/lib/env.ts index 63e80ea..73c35ae 100644 --- a/foundry/packages/frontend/src/lib/env.ts +++ b/foundry/packages/frontend/src/lib/env.ts @@ -1,3 +1,15 @@ +type FoundryRuntimeConfig = { + backendEndpoint?: string; + defaultWorkspaceId?: string; + frontendClientMode?: string; +}; + +declare global { + interface Window { + __FOUNDRY_RUNTIME_CONFIG__?: FoundryRuntimeConfig; + } +} + function resolveDefaultBackendEndpoint(): string { if (typeof window !== "undefined" && window.location?.origin) { return `${window.location.origin}/api/rivet`; @@ -10,20 +22,23 @@ type FrontendImportMetaEnv = ImportMetaEnv & { }; const frontendEnv = import.meta.env as FrontendImportMetaEnv; +const runtimeConfig = typeof window !== "undefined" ? window.__FOUNDRY_RUNTIME_CONFIG__ : undefined; -export const backendEndpoint = import.meta.env.VITE_HF_BACKEND_ENDPOINT?.trim() || resolveDefaultBackendEndpoint(); +export const backendEndpoint = runtimeConfig?.backendEndpoint?.trim() || import.meta.env.VITE_HF_BACKEND_ENDPOINT?.trim() || resolveDefaultBackendEndpoint(); -export const defaultWorkspaceId = import.meta.env.VITE_HF_WORKSPACE?.trim() || "default"; +export const defaultWorkspaceId = runtimeConfig?.defaultWorkspaceId?.trim() || import.meta.env.VITE_HF_WORKSPACE?.trim() || "default"; function resolveFrontendClientMode(): "mock" | "remote" { - const raw = frontendEnv.FOUNDRY_FRONTEND_CLIENT_MODE?.trim().toLowerCase(); + const raw = runtimeConfig?.frontendClientMode?.trim().toLowerCase() || frontendEnv.FOUNDRY_FRONTEND_CLIENT_MODE?.trim().toLowerCase(); if (raw === "mock") { return "mock"; } if (raw === "remote" || raw === "" || raw === undefined) { return "remote"; } - throw new Error(`Unsupported FOUNDRY_FRONTEND_CLIENT_MODE value "${frontendEnv.FOUNDRY_FRONTEND_CLIENT_MODE}". Expected "mock" or "remote".`); + throw new Error( + `Unsupported FOUNDRY_FRONTEND_CLIENT_MODE value "${runtimeConfig?.frontendClientMode ?? frontendEnv.FOUNDRY_FRONTEND_CLIENT_MODE}". Expected "mock" or "remote".`, + ); } export const frontendClientMode = resolveFrontendClientMode();