Repopulation du Quiz HP : cron Vercel et bootstrap manuel
- hpq
- vercel
- cron
- adr
- devops
24 combos film × difficulté à maintenir peuplés. Impossible de regénérer à la volée : il faut une stratégie de stock compatible free tier Vercel et Gemini.
Articles précédents : vision · Gemini · stockage.
Contrainte Vercel Hobby
Découverte en creusant l'implémentation : le plan Hobby n'autorise qu'un seul cron job par jour. Pas de vérification horaire sans upgrade Pro (~20 $/mois) ou scheduler externe (cron-job.org, etc.).
Pour un portfolio perso, j'ai assumé : 1 cron/jour suffit.
Cible et seuil par combo
Chaque combo film + difficulté vise :
- 30 questions en base — stock cible (STOCK_TARGET)
- 20 questions — seuil de déclenchement (STOCK_THRESHOLD)
Soit ~3 parties de buffer à la cible, ~2 au seuil (10 questions par partie en mode classique).
Le cron quotidien parcourt les 24 combos et top-up ceux sous 20 jusqu'à 30, via Gemini + dédup sujet.
Bootstrap initial : manuel
~720 questions pour 24 × 30 — impossible en un seul run cron :
- Timeout serverless Hobby (quelques dizaines de secondes)
- Quota Gemini (~2 appels par question acceptée)
Le bootstrap se fait via npm run hpq:populate en local, combo par combo, sur plusieurs jours si besoin. En pratique j'ai visé 50 questions/film/difficulté sur le film 1 — encore plus long à cause des quotas par modèle.
Script hpq:clear pour repartir propre avant repopulate.
Écart implémentation vs ADR
L'ADR initial supposait des questions consommées à chaque partie. En dev, j'ai basculé sur des questions réutilisables : le stock ne diminue plus quand on joue.
Conséquence : le cron ne compense plus une « consommation » quotidienne — il maintient le niveau après bootstrap, ou après un clear manuel. Pour un trafic portfolio, c'est suffisant. Si le stock devenait critique un jour, un populate manuel reste possible.
Ce qui n'est pas encore codé
Le cron Vercel lui-même : route API protégée par CRON_SECRET, vercel.json schedule, HPQ_GEMINI_API_KEY en prod. Pas urgent tant que le populate local suffit.
Ordre d'implémentation futur :
- Route POST repopulate-all (ou par combo sous seuil)
- vercel.json — schedule 0 6 * * * (ex. 6 h UTC)
- CRON_SECRET en header Authorization
- Logs + garde-fous timeout (traiter N combos max par run)
Alternatives écartées
- Scheduler externe gratuit — fréquence plus haute, mais dépendance tierce pour un besoin non prouvé
- Vercel Pro — cron fréquents, coût récurrent vs contrainte free tier HPQ-000
- Repopulation synchrone au jeu — latence joueur, contraire à la vision
Risques assumés
- Pic de trafic sur un combo le même jour : avec questions réutilisables, le risque d'épuisement est faible ; avec l'ancien modèle consommé, le stock pouvait tomber à zéro avant le cron du lendemain
- Remontée au stock cible lente si quota Gemini saturé — plusieurs jours de cron ou populate manuel
Suite de la série
- Format JSON et double passe de validation — dernier volet technique
Quiz : andrewchicout.dev.