Intégrer le Quiz HP dans le hub plutôt que sur un sous-domaine
- hpq
- architecture
- adr
- nextjs
- vercel
Au départ, je pensais déployer le Quiz HP comme service séparé : sous-domaine, repo à part, isolation totale. En creusant, la plupart des arguments techniques ne tenaient pas. Voici pourquoi tout vit dans le même projet Next.js que le portfolio.
Article précédent : vision et scope du quiz.
Ce qui a changé par rapport au hub d'origine
ADR-002 disait « pas de base de données » — c'était vrai pour le portfolio seul. HPQ amende ce choix : Neon Postgres pour le stock de questions, Drizzle comme ORM, routes API serverless sur Vercel.
Le site n'est plus 100 % statique. Il héberge une section à état dédiée au quiz et des scripts de population locaux (Gemini ne tourne pas en prod pour jouer).
Décision retenue
- Hébergement — même projet Next.js, même déploiement Vercel
- URL — route dédiée sous le domaine principal (pas de sous-domaine)
- Code — isolé par domaine dans app, lib et components
- Extraction future — possible si le projet grossit
Pourquoi pas un service séparé ?
Arguments initiaux écartés :
- Isolation Vercel — les fonctions serverless sont déjà isolées entre routes dans un même projet
- Cron indépendant — un Vercel Cron Job fonctionne aussi bien dans le hub
- Stack différente — non : Next.js dans les deux cas
Ce qu'on gagne en restant dans le portfolio :
- Un seul repo, un seul déploiement, previews PR automatiques
- Réutilisation du design system (thème HP dédié — prochain article)
- Pas de DNS, pas de proxy, pas de communication cross-service
Risques acceptés
Un bug de build dans le code HPQ peut bloquer le déploiement de tout le site — blog et CV inclus. Mitigation : CI, PR, previews avant merge sur main.
Une variable d'env mal configurée sur Neon peut impacter le quiz sans toucher aux pages statiques — d'où une route health API pour diagnostiquer prod.
Organisation concrète
Route group dédié dans l'App Router, avec pages setup / play / results, routes API start-stock-health, composants UI, lib métier (db, gemini, populate), fiches MDX de grounding par film, scripts CLI populate/clear, et thème CSS scoped (Tailwind v4 — pas dans globals.css).
Layout quiz sans header/footer turquoise : entrée visuelle claire dans l'univers HP.
Alternatives écartées
- Sous-domaine dédié — deux déploiements, duplication design system
- Domaine séparé — coût + perte de l'effet vitrine rattachée
- Rewrite proxy entre deux projets Vercel — complexité disproportionnée
Variables d'environnement
- HPQ_DATABASE_URL — Neon en prod Vercel
- GEMINI_API_KEY — populate local ; HPQ_GEMINI_API_KEY prévu pour le cron futur
Le jeu en prod ne dépend pas de Gemini : seulement la base.
Suite de la série
Design system HP (article dédié), choix Gemini et quotas, stockage Neon et dédup, repopulation cron, validation JSON.
Quiz en prod : andrewchicout.dev.