Phase 0: scaffold cup26 — Vite+React+Fastify TS PWA, broadcast theme, app shell

Mirrors the TTRPG stack (strict TS, Tailwind 4, vite-plugin-pwa, esbuild server
bundle, multi-stage Dockerfile, Traefik compose). Floodlit-pitch design tokens,
UI primitives (Button/Card/Badge), TanStack Router shell with Live/Groups/
Bracket/Predict/Story routes (placeholders), dependency-free PWA icon generator.
Raw data staged: openfootball 2026 fixtures + martj42 international results CSV.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 12:49:13 +02:00
commit 4e4e75a1d8
39 changed files with 53029 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# Self-contained compose project for cup26.briggen.dev.
# Deploy: rsync the repo to /root/cup26/, place this file there as
# docker-compose.yml, then `docker compose up -d --build`.
# Joins the EXISTING external `proxy` network — the shared Traefik stack is untouched.
name: cup26
services:
cup26:
build: .
container_name: cup26
restart: unless-stopped
environment:
- PORT=8787
- STATIC_DIR=/app/dist
- NODE_ENV=production
- ALLOWED_ORIGINS=https://cup26.briggen.dev
# football-data.org free API token (https://www.football-data.org/client/register)
- FOOTBALL_DATA_TOKEN=${FOOTBALL_DATA_TOKEN:-}
# opt-in: layer the unofficial real-time source on top of the free API
- ENABLE_SOFASCORE=${ENABLE_SOFASCORE:-false}
security_opt:
- no-new-privileges:true
mem_limit: 384m
memswap_limit: 384m
pids_limit: 200
cpus: 1.0
labels:
- "traefik.enable=true"
- "traefik.http.routers.cup26.rule=Host(`cup26.briggen.dev`)"
- "traefik.http.routers.cup26.entrypoints=websecure"
- "traefik.http.routers.cup26.tls.certresolver=letsencrypt"
- "traefik.http.services.cup26.loadbalancer.server.port=8787"
networks:
- proxy
networks:
proxy:
external: true