Files
linearvoid/docs/operations/gitea-cloudflare-workers.md
T
2026-08-16 09:26:35 +02:00

4.8 KiB

Gitea to Cloudflare Workers — Linear Void

Goal

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

Prerequisites

  1. Cloudflare Worker for the SPA:
    • Dashboard → Workers & Pages → Create → Worker (or Workers Static Assets).
    • Name it linearvoid-frontend (the edge-cache Worker already uses the linearvoid name).
  2. API token with Workers permissions:
  3. Account ID from Cloudflare dashboard overview → store as CLOUDFLARE_ACCOUNT_ID
  4. Wrangler config (frontend/wrangler.toml) binding the frontend/dist output as static assets.

Naming conflict: Workers share a namespace under "Workers & Pages". The edge-cache Worker (infrastructure/cloudflare/worker.js) already uses the linearvoid name, so the SPA Worker is named linearvoid-frontend (see frontend/wrangler.toml).

Project-specific values

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

Gitea Actions workflow

Build the SPA and deploy with Wrangler:

name: Deploy to Cloudflare Workers

on:
  workflow_run:
    workflows: [CI]
    types: [completed]
  workflow_dispatch: {}

jobs:
  deploy:
    if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

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

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

      - name: Build
        env:
          VITE_PUBLIC_APP_URL: ${{ secrets.VITE_PUBLIC_APP_URL }}
          VITE_PUBLIC_WS_URL: ${{ secrets.VITE_PUBLIC_WS_URL }}
          VITE_PUBLIC_HLS_URL: ${{ secrets.VITE_PUBLIC_HLS_URL }}
          VITE_PUBLIC_ADMIN_DEFAULT_MODERATOR: ${{ secrets.VITE_PUBLIC_ADMIN_DEFAULT_MODERATOR }}
          VITE_PUBLIC_ADMIN_DEFAULT_ROOM: ${{ secrets.VITE_PUBLIC_ADMIN_DEFAULT_ROOM }}
          VITE_PUBLIC_ADMIN_MODERATION_LOG_LIMIT: "50"
        run: cd frontend && npm run build

      - name: Deploy to Cloudflare Workers
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
        run: |
          cd frontend
          npx wrangler deploy

Secrets to add in Gitea

Secret Value
CLOUDFLARE_API_TOKEN API token with Workers permissions
CLOUDFLARE_ACCOUNT_ID Cloudflare account ID from dashboard
VITE_PUBLIC_APP_URL Public viewer URL
VITE_PUBLIC_WS_URL WebSocket endpoint
VITE_PUBLIC_HLS_URL HLS playlist URL
VITE_PUBLIC_ADMIN_DEFAULT_MODERATOR Default moderator username
VITE_PUBLIC_ADMIN_DEFAULT_ROOM Default chat room

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 Workers → linearvoid-frontend → Deployments for the new version.
  4. Visit https://linearvoid-frontend.zwitschi82.workers.dev, then attach linearvoid.tv when ready.

Notes

  • The existing ci.yml already builds the frontend; the Workers deploy workflow is additive and independent.
  • Multi-page SPA (vite.config.ts) produces three entry points — Workers static assets serve them correctly.
  • For SPA fallback routing, set Workers static assets not_found_handling to single-page-application (serve index.html for unknown paths).
  • The deploy workflow lives in .gitea/workflows/workers-deploy.yml (triggered after CI succeeds).
  • Cloudflare Workers dashboard: https://dash.cloudflare.com/deb11491c54ec53a24772e98ac6d8128/workers/services/view/linearvoid/production/settings — for managing the infrastructure/cloudflare/worker.js deployment and the SPA Worker