Skip to content

Astro

GCP.Website.Astro deploys an Astro project to Cloud Run. Pages render on the server by default. Pages that export const prerender = true, and everything in public/, are served as static files from the same container.

The build integration ships separately. It only runs at deploy time, so a dev dependency is enough:

Terminal window
pnpm add -D @alchemy.run/frontend-frameworks@latest

Docker has to be running when you deploy. The image is built on your machine.

alchemy.run.ts
import * as Alchemy from "alchemy";
import * as GCP from "@alchemy.run/gcp";
import * as Effect from "effect/Effect";
export const Website = GCP.Website.Astro("Website");
export default Alchemy.Stack(
"MySite",
{ providers: GCP.providers(), state: GCP.state() },
Effect.gen(function* () {
const site = yield* Website;
return { url: site.url };
}),
);

Run alchemy deploy. site.url is the Cloud Run service URL.

alchemy.run.ts
export const Website = GCP.Website.Astro("Website");
export const Website = GCP.Website.Astro("Website", {
env: {
GREETING: "Hello from Cloud Run!",
},
});

Server-rendered pages read it from process.env:

src/pages/index.astro
---
const greeting = process.env.GREETING ?? "hello";
---
<h1>{greeting}</h1>

Your astro.config.* loads as-is: integrations, Vite plugins, and everything else. Don’t add an adapter. Alchemy supplies its own.

astro.config.ts
import tailwindcss from "@tailwindcss/vite";
import { defineConfig } from "astro/config";
export default defineConfig({
vite: { plugins: [tailwindcss()] },
});

The astro prop overrides a few options per deploy, such as site, base, and output.

With output: "static" every page is built ahead of time:

export const Website = GCP.Website.Astro("Website", {
astro: { output: "static" },
assets: { notFoundHandling: "404-page" },
});

404-page serves your built 404.html for unknown paths.

export const Website = GCP.Website.Astro("Website", {
scaling: { minInstanceCount: 1 },
resources: { limits: { cpu: "1", memory: "1Gi" } },
});

One warm instance means no cold start for the first visitor. See Websites for the other settings.

alchemy dev runs the framework’s dev server with hot reload and creates nothing in the cloud. Wrap the site in Alchemy.remote() to deploy it for real during dev.

examples/gcp-website-astro has a server-rendered page, a prerendered page, Tailwind, and a live test.