Joshua Ansah

Menu

Close

Deploying React Apps from Private Repositories to Cloudflare Pages

Deploying React Apps from Private Repositories to Cloudflare Pages

Learn how to seamlessly deploy React applications from private GitHub repositories or organizations to Cloudflare Pages with automatic deployments and custom domains.

Written by

Joshua Ansah

At

September 19, 2025

Deploying React Apps from Private Repositories to Cloudflare Pages

Deploying React applications has never been easier with modern platforms like Cloudflare Pages. However, when your code lives in a private repository or organization, the process requires some additional configuration. In this comprehensive guide, I'll walk you through the entire process of deploying your React app from a private GitHub repository to Cloudflare Pages.

🎯 Why Choose Cloudflare Pages?

Before diving into the deployment process, let's understand why Cloudflare Pages is an excellent choice for React applications:

  • Global CDN: Your app is served from 275+ locations worldwide
  • Zero Configuration: Automatic builds and deployments
  • Custom Domains: Easy SSL and domain management
  • Unlimited Bandwidth: No hidden costs or limits
  • Edge Functions: Serverless functions at the edge
  • Free Tier: Generous free plan for personal projects

🔐 Prerequisites

Before we start, ensure you have:

  • A React application in a private GitHub repository
  • A Cloudflare account (free tier works perfectly)
  • Admin access to your GitHub organization (if applicable)
  • Basic knowledge of Git and React build processes

🚀 Step-by-Step Deployment Guide

Step 1: Prepare Your React Application

First, ensure your React app is production-ready:

// package.json
{
  "name": "my-react-app",
  "version": "0.1.0",
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  }
}

Verify your build works locally:

npm run build
# or
yarn build

Step 2: GitHub Integration Setup

Navigate to Cloudflare Pages and follow these steps:

  1. Sign in to your Cloudflare account
  2. Go to Pages in the dashboard
  3. Click "Connect to Git"
  4. Choose GitHub as your Git provider

Step 3: Authorize Cloudflare for Private Repositories

This is the crucial step for private repositories:

# When prompted, you'll need to:
# 1. Authorize Cloudflare to access your GitHub account
# 2. Grant permissions to access private repositories
# 3. For organization repos, ensure you have admin access

Important Notes:

  • If you're part of a GitHub organization, the organization admin must approve the Cloudflare app
  • You may need to request access from your organization's admin
  • Ensure the Cloudflare GitHub app has access to your specific private repository

Step 4: Repository Selection and Configuration

Once authorized:

# Repository Selection
Repository: your-org/private-react-app
Branch: main # or your preferred deployment branch

# Build Configuration
Framework preset: Create React App
Build command: npm run build
Build output directory: build
Root directory: / # unless your React app is in a subdirectory

Step 5: Environment Variables (If Needed)

For React apps with environment variables:

// In your Cloudflare Pages settings
REACT_APP_API_URL=https://api.yourdomain.com
REACT_APP_ENV=production
REACT_APP_VERSION=1.0.0

Security Tip: Never expose sensitive keys in React environment variables as they're bundled with your client-side code.

Step 6: Custom Build Configuration

For more complex setups, create a custom build configuration:

// In your React app root, create a _headers file
/*
  X-Frame-Options: DENY
  X-Content-Type-Options: nosniff
  X-XSS-Protection: 1; mode=block
  Referrer-Policy: strict-origin-when-cross-origin

/static/*
  Cache-Control: public, max-age=31536000, immutable

Or use a _redirects file for SPA routing:

/*    /index.html   200

⚙️ Advanced Configuration

Custom Domains

After successful deployment:

  1. Go to your Cloudflare Pages project
  2. Navigate to Custom Domains
  3. Add your domain (ensure it's managed by Cloudflare)
  4. SSL certificates are automatically provisioned

Branch Deployments

Configure different branches for different environments:

# Production
Branch: main
Domain: yourapp.com

# Staging
Branch: develop
Domain: staging.yourapp.com

# Feature branches
Branch: feature/*
Domain: [branch-name].yourapp.pages.dev

Build Optimization

Optimize your React build for Cloudflare:

// In your package.json, add build optimizations
{
  "scripts": {
    "build": "GENERATE_SOURCEMAP=false react-scripts build",
    "build:analyze": "npm run build && npx bundle-analyzer build/static/js/*.js"
  }
}

🔧 Troubleshooting Common Issues

Issue 1: Private Repository Not Visible

Solution:

# Ensure proper GitHub app permissions
1. Go to GitHub Settings > Applications > Authorized OAuth Apps
2. Find Cloudflare Pages
3. Grant access to your organization
4. Refresh the repository list in Cloudflare

Issue 2: Build Failures

Common causes and solutions:

# Node version mismatch
# Add .nvmrc file to your repo
echo "18" > .nvmrc

# Missing dependencies
# Ensure package-lock.json is committed
git add package-lock.json
git commit -m "Add package-lock.json"

# Environment variable issues
# Check if all required env vars are set in Cloudflare Pages settings

Issue 3: Routing Issues for SPAs

Solution:

// Create _redirects file in public folder
// public/_redirects
/*    /index.html   200

// Or configure in Cloudflare Pages settings
# Redirect Rules
Source: /*
Destination: /index.html
Status: 200

📊 Performance Optimization

Bundle Analysis

Monitor your build performance:

# Install bundle analyzer
npm install --save-dev webpack-bundle-analyzer

# Add to package.json
"analyze": "npm run build && npx webpack-bundle-analyzer build/static/js/*.js"

Cloudflare-Specific Optimizations

// Enable Cloudflare optimizations in Pages settings
- Auto Minify: CSS, JavaScript, HTML
- Brotli Compression: Enabled
- Always Use HTTPS: Enabled
- Browser Cache TTL: 4 hours

🚦 CI/CD Best Practices

Automated Testing Before Deployment

# .github/workflows/test.yml
name: Test before deploy
on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      - run: npm ci
      - run: npm test -- --coverage --watchAll=false
      - run: npm run build

Preview Deployments

Cloudflare automatically creates preview deployments for:

  • Pull requests
  • Non-production branches
  • Manual deployments

Each preview gets a unique URL: https://[commit-hash].your-project.pages.dev

🔒 Security Considerations

Environment Variables Security

// ✅ Safe for React (public)
REACT_APP_API_URL=https://api.example.com
REACT_APP_APP_NAME=MyApp

// ❌ Never expose sensitive data
REACT_APP_SECRET_KEY=never-do-this
REACT_APP_PRIVATE_API_KEY=also-never-do-this

Content Security Policy

// _headers file
/*
  Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;

📈 Monitoring and Analytics

Cloudflare Analytics

Monitor your deployment through:

  • Real-time traffic analytics
  • Performance metrics
  • Error tracking
  • Geographic distribution

Custom Monitoring

// Add performance monitoring to your React app
import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals';

function sendToAnalytics(metric) {
  // Send to your analytics service
  console.log(metric);
}

getCLS(sendToAnalytics);
getFID(sendToAnalytics);
getFCP(sendToAnalytics);
getLCP(sendToAnalytics);
getTTFB(sendToAnalytics);

🎉 Conclusion

Deploying React applications from private repositories to Cloudflare Pages is straightforward once you understand the permission model and configuration options. The platform offers excellent performance, security, and developer experience for modern web applications.

Key Takeaways:

  • Permissions are crucial: Ensure proper GitHub organization access
  • Build configuration matters: Optimize for production deployments
  • Use preview deployments: Test changes before they go live
  • Monitor performance: Leverage Cloudflare's analytics tools
  • Security first: Never expose sensitive data in client-side code

Next Steps:

  1. Set up automated testing workflows
  2. Configure custom domains and SSL
  3. Implement performance monitoring
  4. Explore Cloudflare Functions for backend functionality

With Cloudflare Pages, your React applications can achieve global scale with minimal configuration while maintaining the security of private repositories.


Happy deploying! 🚀

Useful Links:

Leave comment