diff --git a/.cloudflare/README.md b/.cloudflare/README.md new file mode 100644 index 0000000000..7c05ce136f --- /dev/null +++ b/.cloudflare/README.md @@ -0,0 +1,11 @@ +We have two cloudflare workers that let us serve some assets of this repo +from Cloudflare. + +* `open-source-website-assets` is used for `install.sh` +* `docs-proxy` is used for `https://zed.dev/docs` + +On push to `main`, both of these (and the files they depend on) are uploaded to Cloudflare. + +### Testing + +You can use [wrangler](https://developers.cloudflare.com/workers/cli-wrangler/install-update) to test these workers locally, or to deploy custom versions. diff --git a/.cloudflare/docs-proxy/src/worker.js b/.cloudflare/docs-proxy/src/worker.js new file mode 100644 index 0000000000..f9f441883a --- /dev/null +++ b/.cloudflare/docs-proxy/src/worker.js @@ -0,0 +1,14 @@ +export default { + async fetch(request, _env, _ctx) { + const url = new URL(request.url); + url.hostname = "docs-anw.pages.dev"; + + let res = await fetch(url, request); + + if (res.status === 404) { + res = await fetch("https://zed.dev/404"); + } + + return res; + }, +}; diff --git a/.cloudflare/docs-proxy/wrangler.toml b/.cloudflare/docs-proxy/wrangler.toml new file mode 100644 index 0000000000..b5262cc070 --- /dev/null +++ b/.cloudflare/docs-proxy/wrangler.toml @@ -0,0 +1,8 @@ +name = "docs-proxy" +main = "src/worker.js" +compatibility_date = "2024-05-03" +workers_dev = true + +[[routes]] +pattern = "zed.dev/docs*" +zone_name = "zed.dev" diff --git a/.cloudflare/open-source-website-assets/src/worker.js b/.cloudflare/open-source-website-assets/src/worker.js new file mode 100644 index 0000000000..8f3c074e68 --- /dev/null +++ b/.cloudflare/open-source-website-assets/src/worker.js @@ -0,0 +1,28 @@ +/** + * Welcome to Cloudflare Workers! This is your first worker. + * + * - Run "npm run dev" in your terminal to start a development server + * - Open a browser tab at http://localhost:8787/ to see your worker in action + * - Run "npm run deploy" to publish your worker + * + * Learn more at https://developers.cloudflare.com/workers/ + */ +export default { + async fetch(request, env) { + const url = new URL(request.url); + const key = url.pathname.slice(1).replace(/2$/, ''); + + const object = await env.OPEN_SOURCE_WEBSITE_ASSETS_BUCKET.get(key); + if (!object) { + return await fetch('https://zed.dev/404'); + } + + const headers = new Headers(); + object.writeHttpMetadata(headers); + headers.set('etag', object.httpEtag); + + return new Response(object.body, { + headers, + }); + }, +}; diff --git a/.cloudflare/open-source-website-assets/wrangler.toml b/.cloudflare/open-source-website-assets/wrangler.toml new file mode 100644 index 0000000000..b4947fa938 --- /dev/null +++ b/.cloudflare/open-source-website-assets/wrangler.toml @@ -0,0 +1,8 @@ +name = "open-source-website-assets" +main = "src/worker.js" +compatibility_date = "2024-05-15" +workers_dev = true + +[[r2_buckets]] +binding = 'OPEN_SOURCE_WEBSITE_ASSETS_BUCKET' +bucket_name = 'zed-open-source-website-assets' diff --git a/.github/workflows/deploy_cloudflare.yml b/.github/workflows/deploy_cloudflare.yml new file mode 100644 index 0000000000..dc8aa405ab --- /dev/null +++ b/.github/workflows/deploy_cloudflare.yml @@ -0,0 +1,56 @@ +name: Deploy Docs + +on: + push: + branches: + - main + +jobs: + deploy-docs: + name: Deploy Docs + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + clean: false + + - name: Setup mdBook + uses: peaceiris/actions-mdbook@v2 + with: + mdbook-version: "0.4.37" + + - name: Build book + run: | + set -euo pipefail + mkdir -p target/deploy + mdbook build ./docs --dest-dir=../target/deploy/docs/ + + - name: Deploy Docs + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy target/deploy --project-name=docs + + - name: Deploy Install + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: r2 object put -f script/install.sh zed-open-source-website-assets/install.sh + + - name: Deploy Docs Workers + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: deploy .cloudflare/docs-proxy/src/worker.js + + - name: Deploy Install Workers + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: deploy .cloudflare/docs-proxy/src/worker.js diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml deleted file mode 100644 index cb2d2cb2dc..0000000000 --- a/.github/workflows/deploy_docs.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Deploy Docs - -on: - push: - branches: - - main - -jobs: - deploy-docs: - name: Deploy Docs - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - clean: false - - - name: Setup mdBook - uses: peaceiris/actions-mdbook@v2 - with: - mdbook-version: "0.4.37" - - - name: Build book - run: | - set -euo pipefail - mkdir -p target/deploy - mdbook build ./docs --dest-dir=../target/deploy/docs/ - - - name: Deploy - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy target/deploy --project-name=docs diff --git a/.gitignore b/.gitignore index 1e5e9b0bd3..48e329d820 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ DerivedData/ .venv .blob_store .vscode +.wrangler