summaryrefslogtreecommitdiffhomepage
path: root/infra/cloud.ts
diff options
context:
space:
mode:
Diffstat (limited to 'infra/cloud.ts')
-rw-r--r--infra/cloud.ts105
1 files changed, 105 insertions, 0 deletions
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!),
+ },
+})