mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-18 16:34:18 +01:00
164 lines
4.6 KiB
TypeScript
164 lines
4.6 KiB
TypeScript
import { domain } from "./stage"
|
|
import { EMAILOCTOPUS_API_KEY } from "./app"
|
|
|
|
////////////////
|
|
// 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 stripe.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",
|
|
"charge.refunded",
|
|
"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",
|
|
],
|
|
})
|
|
|
|
const ZEN_MODELS1 = new sst.Secret("ZEN_MODELS1")
|
|
const ZEN_MODELS2 = new sst.Secret("ZEN_MODELS2")
|
|
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 },
|
|
})
|
|
const gatewayKv = new sst.cloudflare.Kv("GatewayKv")
|
|
|
|
////////////////
|
|
// CONSOLE
|
|
////////////////
|
|
|
|
const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID")
|
|
const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY")
|
|
|
|
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,
|
|
ZEN_MODELS1,
|
|
ZEN_MODELS2,
|
|
EMAILOCTOPUS_API_KEY,
|
|
AWS_SES_ACCESS_KEY_ID,
|
|
AWS_SES_SECRET_ACCESS_KEY,
|
|
...($dev
|
|
? [
|
|
new sst.Secret("CLOUDFLARE_DEFAULT_ACCOUNT_ID", process.env.CLOUDFLARE_DEFAULT_ACCOUNT_ID!),
|
|
new sst.Secret("CLOUDFLARE_API_TOKEN", process.env.CLOUDFLARE_API_TOKEN!),
|
|
]
|
|
: []),
|
|
gatewayKv,
|
|
],
|
|
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 }] : [],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|