Files
linearvoid/docs/operations/gitea-cloudflare-pages.md
T
zwitschi 31882f6b73
Deploy to Cloudflare Pages / deploy (push) Failing after 12s
CD / deploy (push) Successful in 52s
CI / test (push) Successful in 1m43s
CI / docker (push) Successful in 43s
docs: add Cloudflare Pages deploy workflow and update pipeline documentation
2026-08-10 11:31:52 +02:00

3.8 KiB

Gitea to Cloudflare Pages — Linear Void

Goal

Deploy the Linear Void frontend (Vite + TypeScript SPA) from Gitea to Cloudflare Pages using Gitea Actions.

Prerequisites

  1. Cloudflare Pages project created (Dashboard → Workers & Pages → Create → Pages), see Cloudflare Pages Setup.
  2. Project name: note the exact name (e.g., linearvoid).
  3. API token with Pages permissions:
  4. Account ID from Cloudflare dashboard overview → store as CLOUDFLARE_ACCOUNT_ID

Project-specific values

Setting Value
Framework Vite + TypeScript
Build command cd frontend && npm install && npm run build
Output directory frontend/dist
Node version 20
Multi-page entries index.html, admin/index.html, admin/login/index.html

Gitea Actions workflow

Create .gitea/workflows/pages-deploy.yml:

name: Deploy to Cloudflare Pages

on:
  push:
    branches: ["main"]
  workflow_dispatch: {}

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: cd frontend && npm ci

      - name: Build
        run: cd frontend && npm run build

      - name: Deploy to Cloudflare Pages
        uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: linearvoid
          directory: frontend/dist
          gitHubToken: ${{ secrets.GITEA_TOKEN }}

If the cloudflare/pages-action@v1 action is unavailable from Gitea, use the direct API approach:

- name: Create deployment artifact
  run: tar -czf site.tgz -C frontend/dist .

- name: Deploy to Cloudflare Pages
  env:
    CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
    CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
  run: |
    curl -sS -X POST \
      "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/pages/projects/linearvoid/deployments" \
      -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
      -H "Content-Type: application/octet-stream" \
      --data-binary @site.tgz

Secrets to add in Gitea

Secret Value
CLOUDFLARE_API_TOKEN API token with Pages:Edit permission
CLOUDFLARE_ACCOUNT_ID Cloudflare account ID from dashboard

Verify deployment

  1. Push to main or trigger manually from Gitea Actions.
  2. Check Gitea Actions → job logs for the deploy step.
  3. Check Cloudflare Pages → Deployments for the new deployment.
  4. Visit the .pages.dev preview URL, then promote to linearvoid.tv when ready.

Notes

  • The existing ci.yml already builds the frontend; the Pages deploy workflow is additive and independent.
  • Multi-page SPA (vite.config.ts) produces three entry points — Cloudflare Pages serves them correctly.
  • For SPA fallback routing, add a frontend/public/_redirects file with /* /index.html 200 before building.
  • If deployments fail with 403, verify the API token has Account → Cloudflare Pages → Edit permission.