diff options
| author | Frank <[email protected]> | 2025-08-08 13:22:54 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-08-08 13:24:32 -0400 |
| commit | 183e0911b76025a1f2a82e979d9834fec2131d0e (patch) | |
| tree | 9987c1753bd64d1ce1d174ab397f1a8c681f642c /infra | |
| parent | c7bb19ad0712469063eab35589aa5d3602b0c5b1 (diff) | |
| download | opencode-183e0911b76025a1f2a82e979d9834fec2131d0e.tar.gz opencode-183e0911b76025a1f2a82e979d9834fec2131d0e.zip | |
wip: gateway
Diffstat (limited to 'infra')
| -rw-r--r-- | infra/app.ts | 22 | ||||
| -rw-r--r-- | infra/cloud.ts | 105 | ||||
| -rw-r--r-- | infra/stage.ts | 5 |
3 files changed, 113 insertions, 19 deletions
diff --git a/infra/app.ts b/infra/app.ts index 2b09516d7..008c1245d 100644 --- a/infra/app.ts +++ b/infra/app.ts @@ -1,8 +1,4 @@ -export const domain = (() => { - if ($app.stage === "production") return "opencode.ai" - if ($app.stage === "dev") return "dev.opencode.ai" - return `${$app.stage}.dev.opencode.ai` -})() +import { domain } from "./stage" const GITHUB_APP_ID = new sst.Secret("GITHUB_APP_ID") const GITHUB_APP_PRIVATE_KEY = new sst.Secret("GITHUB_APP_PRIVATE_KEY") @@ -37,24 +33,12 @@ export const api = new sst.cloudflare.Worker("Api", { }, }) -new sst.cloudflare.x.Astro("Web", { +export const web = new sst.cloudflare.x.Astro("Web", { domain, path: "packages/web", environment: { // For astro config SST_STAGE: $app.stage, - VITE_API_URL: api.url, + VITE_API_URL: api.url.apply((url) => url!), }, }) - -const OPENCODE_API_KEY = new sst.Secret("OPENCODE_API_KEY") -const ANTHROPIC_API_KEY = new sst.Secret("ANTHROPIC_API_KEY") -const OPENAI_API_KEY = new sst.Secret("OPENAI_API_KEY") -const ZHIPU_API_KEY = new sst.Secret("ZHIPU_API_KEY") - -export const gateway = new sst.cloudflare.Worker("GatewayApi", { - domain: `api.gateway.${domain}`, - handler: "packages/function/src/gateway.ts", - url: true, - link: [OPENCODE_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY, ZHIPU_API_KEY], -}) diff --git a/infra/cloud.ts b/infra/cloud.ts new file mode 100644 index 000000000..4625bb282 --- /dev/null +++ b/infra/cloud.ts @@ -0,0 +1,105 @@ +import { WebhookEndpoint } from "pulumi-stripe" +import { domain } from "./stage" +import { web } from "./app" + +export const stripeWebhook = new WebhookEndpoint("StripeWebhook", { + url: $interpolate`https://api.gateway.${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 DATABASE_USERNAME = new sst.Secret("DATABASE_USERNAME") +const DATABASE_PASSWORD = new sst.Secret("DATABASE_PASSWORD") +export const database = new sst.Linkable("Database", { + properties: { + host: "aws-us-east-2-1.pg.psdb.cloud", + database: "postgres", + username: DATABASE_USERNAME.value, + password: DATABASE_PASSWORD.value, + port: 5432, + }, +}) + +new sst.x.DevCommand("Studio", { + link: [database], + dev: { + command: "bun db studio", + directory: "cloud/core", + autostart: true, + }, +}) + +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 authStorage = new sst.cloudflare.Kv("AuthStorage") +export const auth = new sst.cloudflare.Worker("AuthApi", { + domain: `auth.${domain}`, + handler: "cloud/function/src/auth.ts", + url: true, + link: [database, authStorage, GITHUB_CLIENT_ID_CONSOLE, GITHUB_CLIENT_SECRET_CONSOLE], +}) + +const ANTHROPIC_API_KEY = new sst.Secret("ANTHROPIC_API_KEY") +const OPENAI_API_KEY = new sst.Secret("OPENAI_API_KEY") +const ZHIPU_API_KEY = new sst.Secret("ZHIPU_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 }, +}) +export const gateway = new sst.cloudflare.Worker("GatewayApi", { + domain: `api.gateway.${domain}`, + handler: "cloud/function/src/gateway.ts", + url: true, + link: [ + database, + AUTH_API_URL, + STRIPE_WEBHOOK_SECRET, + STRIPE_SECRET_KEY, + ANTHROPIC_API_KEY, + OPENAI_API_KEY, + ZHIPU_API_KEY, + ], +}) + +export const console = new sst.cloudflare.x.StaticSite("Console", { + domain: `console.${domain}`, + path: "cloud/web", + build: { + command: "bun run build", + output: "dist/client", + }, + 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!), + }, +}) diff --git a/infra/stage.ts b/infra/stage.ts new file mode 100644 index 000000000..c1239832b --- /dev/null +++ b/infra/stage.ts @@ -0,0 +1,5 @@ +export const domain = (() => { + if ($app.stage === "production") return "opencode.ai" + if ($app.stage === "dev") return "dev.opencode.ai" + return `${$app.stage}.dev.opencode.ai` +})() |
