From 4ceabdffa07b1af8d99eb73622a4d549d99ec6d2 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 18 Sep 2025 10:59:01 -0400 Subject: wip: zen --- infra/cloud.ts | 157 ------------------------------------------------------- infra/console.ts | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 157 deletions(-) delete mode 100644 infra/cloud.ts create mode 100644 infra/console.ts (limited to 'infra') diff --git a/infra/cloud.ts b/infra/cloud.ts deleted file mode 100644 index 23984cb4c..000000000 --- a/infra/cloud.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { WebhookEndpoint } from "pulumi-stripe" -import { domain } from "./stage" - -//////////////// -// DATABASE -//////////////// - -const cluster = planetscale.getDatabaseOutput({ - name: "opencode", - organization: "anomalyco", -}) - -const branch = - $app.stage === "production" - ? planetscale.getBranchOutput({ - name: "production", - organization: cluster.organization, - database: cluster.name, - }) - : new planetscale.Branch("DatabaseBranch", { - database: cluster.name, - organization: cluster.organization, - name: $app.stage, - parentBranch: "production", - }) -const password = new planetscale.Password("DatabasePassword", { - name: $app.stage, - database: cluster.name, - organization: cluster.organization, - branch: branch.name, -}) - -export const database = new sst.Linkable("Database", { - properties: { - host: password.accessHostUrl, - database: cluster.name, - username: password.username, - password: password.plaintext, - port: 3306, - }, -}) - -new sst.x.DevCommand("Studio", { - link: [database], - dev: { - command: "bun db studio", - directory: "packages/cloud/core", - autostart: true, - }, -}) - -//////////////// -// AUTH -//////////////// - -const GITHUB_CLIENT_ID_CONSOLE = new sst.Secret("GITHUB_CLIENT_ID_CONSOLE") -const GITHUB_CLIENT_SECRET_CONSOLE = new sst.Secret("GITHUB_CLIENT_SECRET_CONSOLE") -const GOOGLE_CLIENT_ID = new sst.Secret("GOOGLE_CLIENT_ID") -const authStorage = new sst.cloudflare.Kv("AuthStorage") -export const auth = new sst.cloudflare.Worker("AuthApi", { - domain: `auth.${domain}`, - handler: "packages/cloud/function/src/auth.ts", - url: true, - link: [database, authStorage, GITHUB_CLIENT_ID_CONSOLE, GITHUB_CLIENT_SECRET_CONSOLE, GOOGLE_CLIENT_ID], -}) - -//////////////// -// GATEWAY -//////////////// - -export const stripeWebhook = new WebhookEndpoint("StripeWebhookEndpoint", { - url: $interpolate`https://${domain}/stripe/webhook`, - enabledEvents: [ - "checkout.session.async_payment_failed", - "checkout.session.async_payment_succeeded", - "checkout.session.completed", - "checkout.session.expired", - "customer.created", - "customer.deleted", - "customer.updated", - "customer.discount.created", - "customer.discount.deleted", - "customer.discount.updated", - "customer.source.created", - "customer.source.deleted", - "customer.source.expiring", - "customer.source.updated", - "customer.subscription.created", - "customer.subscription.deleted", - "customer.subscription.paused", - "customer.subscription.pending_update_applied", - "customer.subscription.pending_update_expired", - "customer.subscription.resumed", - "customer.subscription.trial_will_end", - "customer.subscription.updated", - "customer.tax_id.created", - "customer.tax_id.deleted", - "customer.tax_id.updated", - ], -}) - -const ANTHROPIC_API_KEY = new sst.Secret("ANTHROPIC_API_KEY") -const OPENAI_API_KEY = new sst.Secret("OPENAI_API_KEY") -const XAI_API_KEY = new sst.Secret("XAI_API_KEY") -const BASETEN_API_KEY = new sst.Secret("BASETEN_API_KEY") -const FIREWORKS_API_KEY = new sst.Secret("FIREWORKS_API_KEY") -const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY") -const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", { - properties: { value: auth.url.apply((url) => url!) }, -}) -const STRIPE_WEBHOOK_SECRET = new sst.Linkable("STRIPE_WEBHOOK_SECRET", { - properties: { value: stripeWebhook.secret }, -}) - -//////////////// -// CONSOLE -//////////////// - -let logProcessor -if ($app.stage === "production" || $app.stage === "frank") { - const HONEYCOMB_API_KEY = new sst.Secret("HONEYCOMB_API_KEY") - logProcessor = new sst.cloudflare.Worker("LogProcessor", { - handler: "packages/cloud/function/src/log-processor.ts", - link: [HONEYCOMB_API_KEY], - }) -} - -new sst.cloudflare.x.SolidStart("Console", { - domain, - path: "packages/cloud/app", - link: [ - database, - AUTH_API_URL, - STRIPE_WEBHOOK_SECRET, - STRIPE_SECRET_KEY, - ANTHROPIC_API_KEY, - OPENAI_API_KEY, - XAI_API_KEY, - BASETEN_API_KEY, - FIREWORKS_API_KEY, - ], - environment: { - //VITE_DOCS_URL: web.url.apply((url) => url!), - //VITE_API_URL: gateway.url.apply((url) => url!), - VITE_AUTH_URL: auth.url.apply((url) => url!), - }, - transform: { - server: { - transform: { - worker: { - placement: { mode: "smart" }, - tailConsumers: logProcessor ? [{ service: logProcessor.nodes.worker.scriptName }] : [], - }, - }, - }, - }, -}) diff --git a/infra/console.ts b/infra/console.ts new file mode 100644 index 000000000..6ca842380 --- /dev/null +++ b/infra/console.ts @@ -0,0 +1,157 @@ +import { WebhookEndpoint } from "pulumi-stripe" +import { domain } from "./stage" + +//////////////// +// DATABASE +//////////////// + +const cluster = planetscale.getDatabaseOutput({ + name: "opencode", + organization: "anomalyco", +}) + +const branch = + $app.stage === "production" + ? planetscale.getBranchOutput({ + name: "production", + organization: cluster.organization, + database: cluster.name, + }) + : new planetscale.Branch("DatabaseBranch", { + database: cluster.name, + organization: cluster.organization, + name: $app.stage, + parentBranch: "production", + }) +const password = new planetscale.Password("DatabasePassword", { + name: $app.stage, + database: cluster.name, + organization: cluster.organization, + branch: branch.name, +}) + +export const database = new sst.Linkable("Database", { + properties: { + host: password.accessHostUrl, + database: cluster.name, + username: password.username, + password: password.plaintext, + port: 3306, + }, +}) + +new sst.x.DevCommand("Studio", { + link: [database], + dev: { + command: "bun db studio", + directory: "packages/console/core", + autostart: true, + }, +}) + +//////////////// +// AUTH +//////////////// + +const GITHUB_CLIENT_ID_CONSOLE = new sst.Secret("GITHUB_CLIENT_ID_CONSOLE") +const GITHUB_CLIENT_SECRET_CONSOLE = new sst.Secret("GITHUB_CLIENT_SECRET_CONSOLE") +const GOOGLE_CLIENT_ID = new sst.Secret("GOOGLE_CLIENT_ID") +const authStorage = new sst.cloudflare.Kv("AuthStorage") +export const auth = new sst.cloudflare.Worker("AuthApi", { + domain: `auth.${domain}`, + handler: "packages/console/function/src/auth.ts", + url: true, + link: [database, authStorage, GITHUB_CLIENT_ID_CONSOLE, GITHUB_CLIENT_SECRET_CONSOLE, GOOGLE_CLIENT_ID], +}) + +//////////////// +// GATEWAY +//////////////// + +export const stripeWebhook = new WebhookEndpoint("StripeWebhookEndpoint", { + url: $interpolate`https://${domain}/stripe/webhook`, + enabledEvents: [ + "checkout.session.async_payment_failed", + "checkout.session.async_payment_succeeded", + "checkout.session.completed", + "checkout.session.expired", + "customer.created", + "customer.deleted", + "customer.updated", + "customer.discount.created", + "customer.discount.deleted", + "customer.discount.updated", + "customer.source.created", + "customer.source.deleted", + "customer.source.expiring", + "customer.source.updated", + "customer.subscription.created", + "customer.subscription.deleted", + "customer.subscription.paused", + "customer.subscription.pending_update_applied", + "customer.subscription.pending_update_expired", + "customer.subscription.resumed", + "customer.subscription.trial_will_end", + "customer.subscription.updated", + "customer.tax_id.created", + "customer.tax_id.deleted", + "customer.tax_id.updated", + ], +}) + +const ANTHROPIC_API_KEY = new sst.Secret("ANTHROPIC_API_KEY") +const OPENAI_API_KEY = new sst.Secret("OPENAI_API_KEY") +const XAI_API_KEY = new sst.Secret("XAI_API_KEY") +const BASETEN_API_KEY = new sst.Secret("BASETEN_API_KEY") +const FIREWORKS_API_KEY = new sst.Secret("FIREWORKS_API_KEY") +const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY") +const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", { + properties: { value: auth.url.apply((url) => url!) }, +}) +const STRIPE_WEBHOOK_SECRET = new sst.Linkable("STRIPE_WEBHOOK_SECRET", { + properties: { value: stripeWebhook.secret }, +}) + +//////////////// +// CONSOLE +//////////////// + +let logProcessor +if ($app.stage === "production" || $app.stage === "frank") { + const HONEYCOMB_API_KEY = new sst.Secret("HONEYCOMB_API_KEY") + logProcessor = new sst.cloudflare.Worker("LogProcessor", { + handler: "packages/console/function/src/log-processor.ts", + link: [HONEYCOMB_API_KEY], + }) +} + +new sst.cloudflare.x.SolidStart("Console", { + domain, + path: "packages/console/app", + link: [ + database, + AUTH_API_URL, + STRIPE_WEBHOOK_SECRET, + STRIPE_SECRET_KEY, + ANTHROPIC_API_KEY, + OPENAI_API_KEY, + XAI_API_KEY, + BASETEN_API_KEY, + FIREWORKS_API_KEY, + ], + environment: { + //VITE_DOCS_URL: web.url.apply((url) => url!), + //VITE_API_URL: gateway.url.apply((url) => url!), + VITE_AUTH_URL: auth.url.apply((url) => url!), + }, + transform: { + server: { + transform: { + worker: { + placement: { mode: "smart" }, + tailConsumers: logProcessor ? [{ service: logProcessor.nodes.worker.scriptName }] : [], + }, + }, + }, + }, +}) -- cgit v1.2.3