Skip to main content
Les applications frontend chez Kaeyros Analytics utilisent principalement Next.js (avec SSR) ou Vite (SPA statique). Chaque technologie requiert un pattern Docker distinct : Next.js nécessite un runtime Node.js tandis qu’une SPA Vite peut être servie directement par nginx après export statique.

Variante 1 : Next.js avec SSR

Pour les applications Next.js utilisant le rendu côté serveur, l’API routes ou le middleware, un runtime Node.js est obligatoire.
Dockerfile.nextjs

Configuration requise pour Next.js

Dans votre next.config.js :
next.config.js
Les variables NEXT_PUBLIC_* sont inlinées au moment du build. Elles ne peuvent pas être changées au runtime. Assurez-vous de les passer en ARG/ENV dans le stage build du Dockerfile.

Variante 2 : SPA Vite avec nginx

Pour les applications Vite (React, Vue, Svelte) exportées en statique, nginx est le serveur optimal : léger, rapide et éprouvé en production.
Dockerfile.vite

Configuration nginx pour SPA

nginx.conf

Comparaison des deux approches

Variables d’environnement publiques

Toute variable préfixée par NEXT_PUBLIC_ est exposée au navigateur. Exemples :
  • NEXT_PUBLIC_API_URL
  • NEXT_PUBLIC_APP_NAME
  • NEXT_PUBLIC_SENTRY_DSN
Les variables sensibles (clés API backend, tokens de service) ne doivent jamais utiliser le préfixe public. Elles sont injectées côté serveur ou stockées dans Vault.

Checklist de validation

1

Vérifier le build local

Exécutez npm run build en local avant de containeriser. Résolvez toutes les erreurs de compilation.
2

Tester l'image Docker

3

Valider le routing

Pour les SPA, accédez directement à une sous-route (ex: /dashboard) et vérifiez que la page se charge sans erreur 404.
4

Vérifier les variables publiques

Inspectez le source dans le navigateur et confirmez que les valeurs NEXT_PUBLIC_* ou VITE_* sont correctement substituées.
Pour les frontends Next.js utilisant uniquement des pages statiques (pas de SSR, pas d’API routes), vous pouvez opter pour output: 'export' et servir avec nginx comme une SPA Vite. Cela réduit considérablement la complexité et la taille de l’image.