Deploy a Website

The following guides are based on some shared assumptions:

  • You are using the default build output location (dist/). This location can be changed using the dist configuration option.
  • You are using npm. You can use equivalent commands to run the scripts if you are using Yarn or other package managers.
  • Astro is installed as a local dev dependency in your project, and you have set up the following npm scripts:
  "scripts": {
    "start": "astro dev",
    "build": "astro build",
    "preview": "astro preview"

Building The App

You may run npm run build command to build the app.

$ npm run build

By default, the build output will be placed at dist/. You may deploy this dist/ folder to any of your preferred platforms.

GitHub Pages

Warning: By default, Github Pages will break the _astro/ directory of your deployed website. To disable this behavior and fix this issue, make sure that you use the script below or manually add an empty .nojekyll file to your public/ site directory.

  1. Set the correct in astro.config.mjs.

  2. Inside your project, create with the following content (uncommenting the appropriate lines), and run it to deploy:

    #!/usr/bin/env sh
    # abort on errors
    set -e
    # build
    npm run build
    # navigate into the build output directory
    cd dist
    # add .nojekyll to bypass GitHub Page's default behavior
    touch .nojekyll
    # if you are deploying to a custom domain
    # echo '' > CNAME
    git init
    git add -A
    git commit -m 'deploy'
    # if you are deploying to https://<USERNAME>
    # git push -f<USERNAME>/<USERNAME> main
    # if you are deploying to https://<USERNAME><REPO>
    # git push -f<USERNAME>/<REPO>.git main:gh-pages
    cd -

    You can also run the above script in your CI setup to enable automatic deployment on each push.

GitHub Actions

  1. In the astro project repo, create gh-pages branch then go to Settings > Pages and set to gh-pages branch for GitHub Pages and set directory to / (root).
  2. Set the correct in astro.config.mjs.
  3. Create the file .github/workflows/main.yml and add in the yaml below. Make sure to edit in your own details.
  4. In GitHub go to Settings > Developer settings > Personal Access tokens. Generate a new token with repo permissions.
  5. In the astro project repo (not <YOUR USERNAME> go to Settings > Secrets and add your new personal access token with the name API_TOKEN_GITHUB.
  6. When you push changes to the astro project repo CI will deploy them to <YOUR USERNAME> for you.
# Workflow to build and deploy to your GitHub Pages repo.

# Edit your project details here.
# Remember to add API_TOKEN_GITHUB in repo Settings > Secrets as well!

name: Github Pages Astro CI

  # Triggers the workflow on push and pull request events but only for the main branch
    branches: [main]
    branches: [main]

  # Allows you to run this workflow manually from the Actions tab.

    runs-on: ubuntu-latest

      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      # Install dependencies with npm
      - name: Install dependencies
        run: npm ci

      # Build the project and add .nojekyll file to supress default behaviour
      - name: Build
        run: |
          npm run build
          touch ./dist/.nojekyll

      # Push to your pages repo
      - name: Push to pages repo
        uses: cpina/github-action-push-to-another-repository@main
          API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
          source-directory: 'dist'
          destination-github-username: ${{ }}
          destination-repository-name: ${{ env.deployToRepo }}
          user-email: ${{ env.githubEmail }}
          commit-message: Deploy ORIGIN_COMMIT
          target-branch: gh-pages

Travis CI

  1. Set the correct in astro.config.mjs.

  2. Create a file named .travis.yml in the root of your project.

  3. Run npm install locally and commit the generated lockfile (package-lock.json).

  4. Use the GitHub Pages deploy provider template, and follow the Travis CI documentation.

    language: node_js
      - lts/*
      - npm ci
      - npm run build
      provider: pages
      skip_cleanup: true
      local_dir: dist
      # A token generated on GitHub allowing Travis to push code on you repository.
      # Set in the Travis settings page of your repository, as a secure variable.
      github_token: $GITHUB_TOKEN
      keep_history: true
        branch: master

GitLab Pages

  1. Set the correct in astro.config.mjs.

  2. Set dist in astro.config.mjs to public and public in astro.config.mjs to a newly named folder that is holding everything currently in public. The reasoning is because public is a second source folder in astro, so if you would like to output to public you’ll need to pull public assets from a different folder. Your astro.config.mjs might end up looking like this:

    export default /** @type {import('astro').AstroUserConfig} */ ({
      // Enable the Preact renderer to support Preact JSX components.
      renderers: ['@astrojs/renderer-preact'],
      // files in `static/` will be blindly copied to `public/`
      public: 'static',
      // `public/` is where the built website will be output to
      dist: 'public',
      buildOptions: {
        sitemap: true,
        site: '',
  3. Create a file called .gitlab-ci.yml in the root of your project with the content below. This will build and deploy your site whenever you make changes to your content:

    image: node:14
          - node_modules/
        - npm install
        - npm run build
          - public
        - main


Note: If you are using an older build image on Netlify, make sure that you set your Node.js version in either a .nvmrc file (example: node v14.17.6) or a NODE_VERSION environment variable. This step is no longer required by default.

You can configure your deployment in two ways, via the Netlify website or with a local project netlify.toml file.

netlify.toml file

Create a new netlify.toml file at the top level of your project repository with the following settings:

  command = "npm run build"
  publish = "dist"

Push the new netlify.toml file up to your hosted git repository. Then, set up a new project on Netlify for your git repository. Netlify will read this file and automatically configure your deployment.

Netlify Website UI

You can skip the netlify.toml file and go directly to Netlify to configure your project. Netlify should now detect Astro projects automatically and pre-fill the configuration for you. Make sure that the following settings are entered before hitting the “Deploy” button:

  • Build Command: astro build or npm run build
  • Publish directory: dist

Google Cloud

Different from most available deploy options here, Google Cloud requires some UI clicks to deploy projects. (Most of these actions can also be done using the gcloud CLI).

Cloud Run

  1. Create a new GCP project, or select one you already have.

  2. Make sure the Cloud Run API is enabled.

  3. Create a new service.

  4. Use a container from Docker Hub or build your own using Cloud Build.

  5. Configure a port from which the files are served.

  6. Enable public access by adding a new permission to allUsers called Cloud Run Invoker.

Cloud Storage

  1. Create a new GCP project, or select one you already have.

  2. Create a new bucket under Cloud Storage.

  3. Give it a name and other required settings.

  4. Upload your dist folder into it or upload using Cloud Build.

  5. Enable public access by adding a new permission to allUsers called Storage Object Viewer.

  6. Edit the website configuration and add ìndex.html as entrypoint and 404.html as errorpage.

Google Firebase

  1. Make sure you have firebase-tools installed.

  2. Create firebase.json and .firebaserc at the root of your project with the following content:


      "hosting": {
        "public": "dist",
        "ignore": []


      "projects": {
        "default": "<YOUR_FIREBASE_ID>"
  3. After running npm run build, deploy using the command firebase deploy.


  1. First install surge, if you haven’t already.

  2. Run npm run build.

  3. Deploy to surge by typing surge dist.

You can also deploy to a custom domain by adding surge dist


  1. Install Heroku CLI.

  2. Create a Heroku account by signing up.

  3. Run heroku login and fill in your Heroku credentials:

    $ heroku login
  4. Create a file called static.json in the root of your project with the below content:


      "root": "./dist"

    This is the configuration of your site; read more at heroku-buildpack-static.

  5. Set up your Heroku git remote:

    # version change
    $ git init
    $ git add .
    $ git commit -m "My site ready for deployment."
    # creates a new app with a specified name
    $ heroku apps:create example
    # set buildpack for static sites
    $ heroku buildpacks:set
  6. Deploy your site:

    # publish site
    $ git push heroku master
    # opens a browser to view the Dashboard version of Heroku CI
    $ heroku open


To deploy your Astro project with a Vercel for Git, make sure it has been pushed to a Git repository.

Go to and import the project into Vercel using your Git of choice (GitHub, GitLab or BitBucket). Follow the wizard to select the project root with the project’s package.json and override the build step using npm run build and the output dir to be ./dist

After your project has been imported, all subsequent pushes to branches will generate Preview Deployments, and all changes made to the Production Branch (commonly “main”) will result in a Production Deployment.

Once deployed, you will get a URL to see your app live, such as the following:

Azure Static Web Apps

You can deploy your Astro project with Microsoft Azure Static Web Apps service. You need:

Install the extension in VS Code and navigate to your app root. Open the Static Web Apps extension, sign in to Azure, and click the ’+’ sign to create a new Static Web App. You will be prompted to designate which subscription key to use.

Follow the wizard started by the extension to give your app a name, choose a framework preset, and designate the app root (usually /) and built file location /dist. The wizard will run and will create a GitHub action in your repo in a .github folder.

The action will work to deploy your app (watch its progress in your repo’s Actions tab) and, when successfully completed, you can view your app in the address provided in the extension’s progress window by clicking the ‘Browse Website’ button that appears when the GitHub action has run.

Cloudflare Pages

You can deploy your Astro project on Cloudflare Pages. You need:

  • A Cloudflare account. If you don’t already have one, you can create a free Cloudflare account during the process.
  • Your app code pushed to a GitHub or a GitLab repository.

Then, set up a new project on Cloudflare Pages.

Use the following build settings:

  • Framework preset: Astro
  • Build command: npm run build
  • Build output directory: dist
  • Environment variables (advanced): Currently, Cloudflare Pages supports NODE_VERSION = 12.18.0 in the Pages build environment by default. Astro requires 14.15.0, v16.0.0, or higher. You can add an environment variable with the Variable name of NODE_VERSION and a Value of a Node version that’s compatible with Astro or by specifying the node version of your project in a .nvmrc or .node-version file.

Then click the Save and Deploy button.


You can deploy your Astro project on Render following these steps:

  1. Create a account and sign in
  2. Click the New + button from your dashboard and select Static Site
  3. Connect your GitHub or GitLab repository or alternatively enter the public URL of a public repository
  4. Give your website a name, select the branch and specify the build command and publish directory
    • build command: npm run build
    • publish directory: dist
  5. Click the Create Static Site button


You can deploy your Astro project using Buddy. To do so you’ll need to:

  1. Create a Buddy account here.

  2. Create a new project and connect it with a git repository (GitHub, GitLab, BitBucket, any private Git Repository or you can use Buddy Git Hosting).

  3. Add a new pipeline.

  4. In the newly created pipeline add a Node.js action.

  5. In this action add:

    npm install
    npm run build
  6. Add a deployment action - there are many to choose from, you can browse them here. Although their can settings differ, remember to set the Source path to dist.

  7. Press the Run button.


You can deploy your Astro project using the steps in the following sections.

Create the Astro Site

If you don’t have an existing Astro site, you can create one by running:

# Make a new project directory, and navigate directly into it
$ mkdir my-astro-project && cd $_

# prepare for liftoff...
$ npm init astro

# install dependencies
$ npm install

# start developing!
$ npm run dev

# when you're ready: build your static site to `dist/`
$ npm run build

Add Layer0

# First, globally install the Layer0 CLI:
$ npm i -g @layer0/cli

# Then, add Layer0 to your Astro site:
$ 0 init

Update your Layer0 Router

Paste the following into routes.ts:

// routes.ts
import { Router } from '@layer0/core';

export default new Router()
    ({ cache, serveStatic }) => {
        browser: {
          // cache js, css, and images in the browser for one hour...
          maxAgeSeconds: 60 * 60,
        edge: {
          // ... and at the edge for one year
          maxAgeSeconds: 60 * 60 * 24 * 365,
  .match('/:path*', ({ cache, serveStatic, setResponseHeader }) => {
      // prevent the browser from caching html...
      browser: false,
      edge: {
        // ...cache html at the edge for one year
        maxAgeSeconds: 60 * 60 * 24 * 365,
    setResponseHeader('content-type', 'text/html; charset=UTF-8');

You can remove the origin backend from layer0.config.js:

module.exports = {};

Deploy to Layer0

To deploy your site to Layer0, run:

# Create a production build of your astro site
$ npm run build

# Deploy it to Layer0
$ 0 deploy


This guide was originally based off Vite’s well-documented static deploy guide.