Webapp til workshop-brug med:
- en storskærmsvisning med dynamiske AI-assistenter i iframes side om side
- et kontrolpanel i modal til runder, QR-kode, resultater og redigering af titler/chatbot-id'er
- en separat mobilvenlig afstemningsside, hvor hver enhed kan stemme én gang pr. runde
- en separat resultatvisning på
/results - password-beskyttelse for hele appen
- lokal filpersistens i
data/store.json
npm install
npm run devDet starter:
- frontend på
http://localhost:5173 - backend på
http://localhost:8787
Produktionslignende lokal kørsel:
npm run build
npm run startAppen er derefter beskyttet af login på:
/login
Password er sat i serveren. Health check endpointet /healthz er offentligt, så hosting-platformen kan verificere servicen uden login.
Projektet er klargjort til Render som en enkelt Web Service via render.yaml.
git init -b main
git add .
git commit -m "Prepare Render deployment"
git remote add origin <din-github-repo-url>
git push -u origin maindist, tmp og testartefakter er ignoreret i .gitignore.
- Opret en ny Blueprint eller Web Service fra GitHub-repoet.
- Brug
mainsom branch. - Vælg nærmeste EU-region.
- Brug laveste passende instance type.
Render-konfigurationen er:
- build:
npm install --include=dev && npm run build - start:
npm start - health check:
/healthz
Sæt disse i Render:
NODE_ENV=productionPUBLIC_BASE_URL=https://<din-service>.onrender.com
Appen bruger PUBLIC_BASE_URL til:
- QR-link til afstemningen
- public links til adminvisning
- public links til resultatvisning
Hvis PUBLIC_BASE_URL ikke er sat, forsøger appen at udlede base URL fra request host i produktion.
Åbn og test:
/login//vote/results
Minimumstest:
- verificér at
/loginvises uden at være logget ind - opret en runde
- afgiv mindst to stemmer fra to forskellige sessioner
- verificér at live-resultater opdateres
- verificér at iframe-væggen forbliver stabil under afstemning
data/store.jsonligger på Render-instansen og kan blive nulstillet ved redeploy eller restart- det er accepteret i denne løsning
- Render free tier kan have cold starts, så åbn appen lidt før workshopstart
- password-beskyttelsen er hardcoded til workshop-brug og bør flyttes til en environment variable, hvis løsningen senere skal bruges mere permanent
server/index.mjs: API, realtime-opdateringer og produktionens URL-logikrender.yaml: Render deploy-konfigurationdata/store.json: assistentopsætning, runder og stemmersrc/App.tsx: routing, adminflow, mobilafstemning og resultatvisning