# 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: - Create at - Permission: `Account → Workers Scripts → Edit` and `Account → Workers Routes → Edit` - Store in Gitea → Settings → Secrets as `CLOUDFLARE_API_TOKEN` 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: ```yaml 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 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 | ## 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). ## Related resources - 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