Cloudflare Workers is an excellent option as a CDN for deploying your Greenwood site, though if you are new to using this service consider deploying with Netlify as it is a simpler process.
This will require a paid account with Cloudflare (currently $5 per month) with a linked domain for custom domain and subdomains.
You will need to globally install Cloudflare's CLI tool Wrangler
yarn add global @cloudflare/wrangler
In the root of your project directory initialize Wrangler
wrangler init
Authenticate your cloudflare account with:
wrangler config
A wrangler.toml file was generated at the root of your project directory, update it like this...
name = "demo" //workers.dev subdomain name automatically named for the directory
type = "webpack"
account_id = "abcd12345...." //your account id
[env.production]
workers_dev = true
[site]
bucket = "./public" //where greenwood generated the compiled code
entry-point = "workers-site"
Compile your code
greenwood build
Then push your code to Cloudflare workers
wrangler publish
When completed a url for workers subdomain will be printed in your terminal.
To have automatic deployments whenever you push updates to your repo, you will need to configure GitHub actions to accomplish this, otherwise you can push updated manually but running the build and publish commands each time you wish to update the site.
Add the email address associated with your account and your global api key from Cloudflare to the repositories GitHub secrets.
At the root of your project add '.github/workflows/main.yml'
name: Deploy production site
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Navigate to repo
run: cd $GITHUB_WORKSPACE
- name: Install Chromium Library Dependencies
run: |
sh ./.github/workflows/chromium-lib-install.sh
- uses: actions/setup-node@v1
with:
node-version: "12.x"
- name: Install deps
run: npm install
- name: Build docs
run: npm run build
- name: Publish
uses: cloudflare/wrangler-action@1.1.0
with:
apiKey: ${{ secrets.CF_WORKERS_KEY }}
email: ${{ secrets.CF_WORKERS_EMAIL }}
environment: "production"
In the same directory as main.yml create a file 'chromium-lib-install.sh'
#!/usr/bin/bash
sudo apt-get update \\
&& sudo apt-get install -yq libgconf-2-4 \\
&& sudo apt-get install -y wget --no-install-recommends \\
&& sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - \\
&& sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \\
&& sudo apt-get update \\
&& sudo apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf --no-install-recommends \\
&& sudo rm -rf /var/lib/apt/lists/*
Push your updates to your repo and the action will begin automatically. This will create a new worker with the name from the toml file -production (IE demo-production), make sure custom url is attached to this worker.