Deploy an Astro site
Astro is an all-in-one web framework for building fast, content-focused websites. By default, Astro builds websites that have zero JavaScript runtime code.
Refer to the Astro Docs to learn more about Astro or for assistance with an Astro project.
In this guide, you will create a new Astro application and deploy it using Cloudflare Pages.
Set up a new project
To use create-cloudflare
to create a new Astro project, run the following command:
$ npm create cloudflare@latest my-astro-app -- --framework=astro
Astro will ask:
Which project type you would like to set up. Your answers will not affect the rest of this tutorial. Select an answer ideal for your project.
If you want to initialize a Git repository. We recommend you to select
No
and follow this guide’s Git instructions below. If you selectYes
, do not follow the below Git instructions precisely but adjust them to your needs.
create-cloudflare
will then install dependencies, including the Wrangler CLI and the @astrojs/cloudflare
adapter, and ask you setup questions.
Astro configuration
You can deploy an Astro Server-side Rendered (SSR) site to Cloudflare Pages using the @astrojs/cloudflare
adapter. SSR sites render on Pages Functions and allow for dynamic functionality and customizations.
Add the @astrojs/cloudflare
adapter to your project’s package.json
by running:
$ npm run astro add cloudflare
Before you continue
All of the framework guides assume you already have a fundamental understanding of Git. If you are new to Git, refer to this summarized Git handbook on how to set up Git on your local machine.
If you clone with SSH, you must generate SSH keys on each computer you use to push or pull from GitHub.
Refer to the GitHub documentation and Git documentation for more information.
Create a GitHub repository
Create a new GitHub repository by visiting repo.new. After creating a new repository, go to your newly created project directory to prepare and push your local application to GitHub by running the following commands in your terminal:
$ git init
$ git remote add origin https://github.com/<your-gh-username>/<repository-name>
$ git add .
$ git commit -m "Initial commit"
$ git branch -M main
$ git push -u origin main
Deploy with Cloudflare Pages
Deploy via the create-cloudflare
CLI (C3)
If you use create-cloudflare
(C3) to create your new Astro project, C3 will install all dependencies needed for your project and prompt you to deploy your project via the CLI. If you deploy, your site will be live and you will be provided with a deployment URL.
Deploy via the Cloudflare dashboard
- Log in to the Cloudflare dashboard and select your account.
- In Account Home, select Workers & Pages > Create application > Pages > Connect to Git.
You will be asked to authorize access to your GitHub account if you have not already done so. Cloudflare needs this so that it can monitor and deploy your projects from the source. You may narrow access to specific repositories if you prefer; however, you will have to manually update this list within your GitHub settings when you want to add more repositories to Cloudflare Pages.
Select the new GitHub repository that you created and, in the Set up builds and deployments section, provide the following information:
Configuration option | Value |
---|---|
Production branch | main |
Build command | npm run build |
Build directory | dist |
Optionally, you can customize the Project name field. It defaults to the GitHub repository’s name, but it does not need to match. The Project name value is assigned as your *.pages.dev
subdomain.
After completing configuration, select Save and Deploy.
You will see your first deployment in progress. Pages installs all dependencies and builds the project as specified.
Cloudflare Pages will automatically rebuild your project and deploy it on every new pushed commit.
Additionally, you will have access to preview deployments, which repeat the build-and-deploy process for pull requests. With these, you can preview changes to your project with a real URL before deploying them to production.
Modes
There are currently two modes supported when using Pages Functions with the @astrojs/cloudflare
adapter.
- Advanced mode: This mode is used when you want to run your Function in
advanced
mode. This mode picks up the_worker.js
indist
, or a directory mode where Pages will compile the Worker out of a Functions folder in the project root.
- Directory mode: This mode is used when you want to run your Pages Function in
directory
mode. In this mode, the adapter will compile the client-side part of your application the same way, but it will move the Worker into afunctions
folder in the project root. The adapter will allow you to access your Pages Functions from yourfunctions
folder. This allows you to add Pages Plugins and Middleware which can be checked into version control.
To use directory
mode, modify your astro.config.mjs
file to add mode: "directory"
to the adapter configuration:
astro.config.mjsimport { defineConfig } from "astro/config";
import cloudflare from "@astrojs/cloudflare";
export default defineConfig({ output: 'server', adapter: cloudflare({ mode: "directory" }),
});
Use bindings in your Astro application
A binding allows your application to interact with Cloudflare developer products, such as KV, Durable Object, R2, and D1.
Use bindings in Astro components and API routes by using context.local
from Astro Middleware to access the Cloudflare runtime which amongst other fields contains the Cloudflare’s environment and consecutively any bindings set for your application.
Refer to the following example of how to access a KV namespace with TypeScript.
First, you need to define Cloudflare runtime and KV type by updating the env.d.ts
:
src/env.d.ts/// <reference types="astro/client" />
type KVNamespace = import("@cloudflare/workers-types").KVNamespace;
type ENV = { // replace `MY_KV` with your KV namespace MY_KV: KVNamespace;
};
// Depending on your adapter mode
// use `AdvancedRuntime<ENV>` for advance runtime mode
// use `DirectoryRuntime<ENV>` for directory runtime mode
type Runtime = import("@astrojs/cloudflare").AdvancedRuntime<ENV>;
declare namespace App { interface Locals extends Runtime {}
}
You can then access your KV from an API endpoint in the following way:
src/pages/my-endpoint.tsimport type { APIContext } from "astro";
export async function get({locals}: APIContext) => { // the type KVNamespace comes from the @cloudflare/workers-types package const { MY_KV } = locals.runtime.env;
return { // ... };
};
Besides endpoints, you can also use bindings directly from your Astro components:
src/pages/index.astro---
const myKV = Astro.locals.runtime.env.MY_KV;
const value = await myKV.get("key");
---
<div>{value}</div>
To learn more about the Astro Cloudflare runtime, refer to the Access to the Cloudflare runtime in the Astro documentation.
Learn more
By completing this guide, you have successfully deployed your Astro site to Cloudflare Pages. To get started with other frameworks, refer to the list of Framework guides.