---
title: Cloudflare Pages
description: Guide to deploying Afilmory via Cloudflare Pages.
createdAt: 2025-07-20T22:35:03+08:00
lastModified: 2025-11-23T19:40:52+08:00
order: 53
---

# Cloudflare Pages Deployment

Cloudflare Pages provides fast, global static hosting with excellent CDN performance. Perfect for static gallery deployments.

## Prerequisites

You need to upload your images to an OSS (Object Storage Service) like AWS S3 or Cloudflare R2 before deploying.

- Cloudflare account (free tier available)
- GitHub or GitLab repository
- Photos processed with builder

## Quick Deploy

Run the following command to build and deploy your application to Cloudflare Pages:

```bash
pnpm --filter=@afilmory/web deploy:cloudflare
```

## Deployment Steps

### Step 1: Connect Repository

1. Go to [Cloudflare Dashboard](https://dash.cloudflare.com)
2. Navigate to Pages → Create a project
3. Connect your GitHub/GitLab repository
4. Select the repository and branch

### Step 2: Configure Build Settings

**Build configuration:**

- **Framework preset**: Vite
- **Build command**: `pnpm run build:manifest && pnpm --filter web build`
- **Build output directory**: `apps/web/dist`
- **Root directory**: (leave empty, or set to project root)

**Environment variables:**
Add your storage credentials:

```
S3_ACCESS_KEY_ID=your_key
S3_SECRET_ACCESS_KEY=your_secret
S3_BUCKET_NAME=your_bucket
S3_REGION=us-east-1
```

### Step 3: Deploy

1. Click "Save and Deploy"
2. Cloudflare Pages will:
   - Install dependencies
   - Run builder to generate thumbnails and manifest
   - Build the static site
   - Deploy to Cloudflare's global CDN

## Build Configuration

### Using wrangler.toml (Optional)

Create `apps/web/wrangler.toml`:

```toml
name = "afilmory-gallery"
compatibility_date = "2024-01-01"

[build]
command = "pnpm run build:manifest && pnpm --filter web build"
cwd = "."
```

### Environment Variables

Set in Cloudflare Dashboard → Pages → Your Project → Settings → Environment Variables:

**Storage (S3 example):**

```
S3_ACCESS_KEY_ID
S3_SECRET_ACCESS_KEY
S3_BUCKET_NAME
S3_REGION
```

**Production vs Preview:**

- Set different variables for Production and Preview environments
- Useful for testing with different storage buckets

## Custom Domain

1. Go to Pages → Your Project → Custom domains
2. Add your domain
3. Configure DNS:
   - Add CNAME record pointing to Cloudflare Pages
   - Cloudflare will automatically provision SSL

## Continuous Deployment

Cloudflare Pages automatically:

- **Production**: Deploys on push to main/master
- **Preview**: Creates preview deployments for pull requests

Each deployment gets a unique URL.

## Performance Features

Cloudflare Pages provides:

- **Global CDN**: Fast delivery worldwide
- **Automatic compression**: Gzip and Brotli
- **Image optimization**: Automatic image optimization (Pro plan)
- **Cache control**: Intelligent caching headers

## Build Limits

Free tier limits:

- **Build time**: 20 minutes per build
- **Builds per month**: 500
- **Bandwidth**: 500 requests/second

Upgrade to Pro for higher limits.

## Troubleshooting

**Build failures:**

- Check build logs in Cloudflare Dashboard
- Verify all environment variables are set
- Ensure `builder.config.ts` is correct
- Check storage credentials

**Missing photos:**

- Verify thumbnails and manifest are in build output
- Check file paths are correct
- Ensure storage is accessible during build

**Slow builds:**

- Use repo cache plugin to avoid full rebuilds
- Optimize storage access
- Consider reducing photo count

## Limitations

Deploying the `web` app directly to Cloudflare Pages results in a static site. This means you will lose server-side features provided by the `ssr` application (Next.js), such as:

- **Dynamic Open Graph (OG) Images**: Social media preview cards will not be generated dynamically.

- **Share/Iframe Support**: Specific sharing functionality that relies on server-side rendering may not work as expected.

To support these features on Cloudflare, you would need to deploy the `ssr` application using a Cloudflare Workers adapter for Next.js (e.g., `@opennextjs/cloudflare`), which adds significant complexity to the deployment process.

## Next Steps

- Configure custom domain
- Set up monitoring
- Optimize build performance
- Review [Cloudflare Pages documentation](https://developers.cloudflare.com/pages)

## Learn more

- [Commands - Wrangler](https://developers.cloudflare.com/workers/wrangler/commands/#deploy-1)

- [Deploy a Next.js project on Workers - Cloudflare Docs](https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/)
