Registre public de diplômes — Erreurs courantes¶
Le flux en deux temps est la version voulue — ne pas le simplifier¶
Contexte (audité le 2026-09-11) : la copie locale du dépôt avait des modifications non commitées sur src/App.tsx, src/styles.css et src/types.ts qui supprimaient le flux de vérification en deux temps ajouté par le commit a71e396 (« fix: secure public diploma verification flow », voir overview.md) — retour à un simple GET /api/diplomas/verify/<ref>/ affichant tout directement, sans le formulaire « Nom et prénoms » ni le honeypot.
Confirmé (2026-09-11) : le flux en deux temps est la version correcte. Ces modifications locales étaient un essai non voulu et ont été annulées (git checkout -- src/App.tsx src/styles.css src/types.ts) — le dépôt local est de nouveau identique à main/prod. Ce point est clos, mais gardé ici en mémoire : si une modification future retire à nouveau le formulaire de déblocage ou le honeypot verificationWebsite, ce n'est pas un raccourci anodin — a71e396 l'a ajouté précisément pour limiter le scraping d'identité par énumération du matricule (voir overview.md). Ne pas la retirer sans revalider ce risque.
Un chemin qui ne respecte pas le format matricule n'est plus bloqué par nginx¶
Symptôme : curl https://diplome.epitech.africa/nimporte-quoi renvoie 200 (page React) au lieu du 404 que décrit le README.md (« Toute autre route retourne 404 »).
Cause : la location nginx qui filtrait les chemins par regex (^/EPA-[A-Za-z]{2}-...$) a été commentée par les commits fix(nginx) : comment rule for validation (4714c77, 8d9c9cf, 1ᵉʳ juillet 2026), et le location / catch-all est passé de return 404; à try_files $uri /index.html; (comportement SPA classique). Voir nginx.conf :
# location ~ "^/EPA-[A-Za-z]{2}-[A-Za-z0-9]{2,12}-[0-9]{4}-[0-9]{4}/?$" {
# try_files /index.html =404;
# }
...
location / {
try_files $uri /index.html;
}
Ce n'est pas un bug à corriger — c'est l'état actuel assumé du système : la validation du format se fait uniquement côté client (regex dans src/App.tsx, voir overview.md). Un chemin invalide affiche l'écran « Format incorrect » dans le navigateur au lieu d'un 404 HTTP brut. Le README.md du projet n'a pas été mis à jour en conséquence — à garder en tête si vous vous fiez uniquement à sa section « Routes publiques autorisées ».
Si un vrai 404 HTTP est nécessaire (ex. pour des raisons de SEO/scraping), il faudrait décommenter la règle nginx — mais elle a été commentée délibérément (message de commit « comment rule for validation »), donc creuser d'abord pourquoi avant de la réactiver (elle a peut-être bloqué des chemins d'assets ou de sous-routes légitimes).
pnpm install --frozen-lockfile échoue en CI ou en local après clone¶
Symptôme historique (avant 0d73d76) : pnpm install échoue ou se comporte de façon inattendue après l'ajout de pnpm-workspace.yaml par le commit a71e396.
Cause : ce commit a introduit pnpm-workspace.yaml avec seulement allowBuilds/onlyBuiltDependencies, sans clé packages — pnpm considère alors qu'un fichier workspace existe mais ne déclare aucun package, ce qui peut désynchroniser la résolution du lockfile.
Correctif (0d73d76, « fix: declare pnpm workspace package ») : ajout de packages: [.] en tête du fichier :
Si l'erreur réapparaît après une modification de pnpm-workspace.yaml ou package.json, vérifier en premier que la clé packages est bien présente et pointe vers . (ce repo n'a qu'un seul package, à la racine — ce n'est pas un vrai monorepo).
Le build Docker prend l'URL backend du mauvais environnement¶
Symptôme : le site en prod appelle localhost:7010 (ou une autre URL de dev) au lieu de l'API EPIDOCS de production, ou inversement un environnement de test appelle la prod.
Cause : VITE_API_BASE_URL est gravée dans le bundle JS au moment du pnpm build (voir overview.md — gotcha build-time). Si l'image a été construite avec la mauvaise valeur de secret GitHub Actions, ou si une image buildée en local (.env.local → http://localhost:7010) est poussée par erreur, le comportement observé sera celui-là — indépendamment de ce qui est écrit dans le .env du VPS (qui ne contient que IMAGE, APP_BIND, APP_PORT).
Solution : vérifier la valeur réellement bakée dans l'image qui tourne (procédure : diagnostics.md), puis si elle est incorrecte, corriger le secret VITE_API_BASE_URL et redéployer via la pipeline (git push sur main, ou relancer le workflow) — jamais en modifiant le conteneur en place, la valeur ne peut pas être changée à chaud.
Le nom de package GHCR à surveiller¶
Le repo s'appelle public-diploma-verify mais package.json déclare "name": "epidocs-diploma-verify" — ce nom package.json n'a aucun impact sur le nom de l'image (IMAGE_NAME: epitechafrik/public-diploma-verify est fixé explicitement dans .github/workflows/ci-cd.yml, indépendamment de package.json). Ne pas se fier au nom du package.json pour deviner l'image GHCR ou le nom du conteneur — utiliser docker ps / docker images ghcr.io/epitechafrik/public-diploma-verify pour confirmer.