Retour aux articles

Déployer un site Next.js 16 sur Hostinger depuis GitHub

  • Next.js

Pourquoi pas Vercel ?

Vercel est l'hébergeur naturel de Next.js, et il fonctionne très bien. Mais quand on a déjà un hébergement mutualisé pour ses sites WordPress, ses sous-domaines et ses e-mails, il est pratique de tout regrouper au même endroit. Hostinger propose maintenant l'hébergement d'applications Node.js, ce qui permet de faire tourner un vrai serveur Next.js, avec les routes API et le rendu à la demande.

C'est comme ça que ce portfolio est en ligne. Voici la méthode, et les pièges que j'ai rencontrés.

Le principe : Hostinger se connecte à ton dépôt GitHub. À chaque git push sur la branche choisie, il récupère le code, installe les dépendances, lance npm run build et redémarre le serveur. Tu ne déposes plus jamais de fichiers à la main.

1. Créer le site Node.js et connecter GitHub

Dans le panneau Hostinger (hPanel), on ajoute un site de type application Node.js, puis on connecte son compte GitHub et on choisit le dépôt. Les réglages à vérifier :

Réglage Valeur pour ce portfolio Pourquoi
Branche main Seule la branche principale part en production
Version de Node.js 22 Une version LTS, compatible avec Next.js 16
Gestionnaire de paquets npm Celui qui correspond au package-lock.json du dépôt
Commande de build build Le script npm run build du package.json
Dossier de sortie .next Le dossier généré par Next.js

Hostinger détecte que c'est un projet Next.js et active le déploiement automatique : chaque push sur main déclenche un nouveau build.

2. Les variables d'environnement

Le formulaire de contact de ce site envoie des e-mails avec Resend, ce qui demande une clé d'API. Cette clé ne doit jamais se retrouver dans le dépôt GitHub.

typescript
// app/api/contact/route.ts
const resend = new Resend(process.env.RESEND_API_KEY);

En local, la clé est dans un fichier .env ignoré par Git. En production, on la déclare dans les réglages du site sur hPanel, dans la section des variables d'environnement.

Attention aux variables NEXT_PUBLIC_ : elles sont intégrées dans le JavaScript envoyé au navigateur au moment du build. Si tu en modifies une sur Hostinger, il faut relancer un build pour que le changement soit pris en compte. Et puisqu'elles sont visibles par tous, n'y mets jamais de secret.

3. Le workflow au quotidien

Comme chaque push sur main part directement en ligne, main doit toujours contenir du code testé. Ma routine :

bash
# 1. Travailler sur une branche dédiée
git switch -c chore/update-deps

# 2. Vérifier que le build passe en local
npm run build

# 3. Fusionner dans main une fois tout validé
git switch main
git merge chore/update-deps

# 4. Pousser : Hostinger lance le déploiement
git push origin main

Pourquoi tester le build en local : npm run dev est beaucoup plus tolérant que npm run build. Une erreur TypeScript ou une page qui plante au pré-rendu passe inaperçue en développement, mais fait échouer le build en production. Deux minutes de vérification en local évitent un aller-retour.

4. Lire les logs de build

Chaque déploiement produit un journal détaillé, découpé en étapes : clonage du dépôt, installation des dépendances, build, publication, redémarrage. Sur ce portfolio, un déploiement complet prend un peu plus d'une minute.

text
==> Cloning repository
==> Installing dependencies
==> Building
▲ Next.js 16.4.3 (webpack)
✓ Compiled successfully
✓ Generating static pages (31/31)
==> Publishing
==> Restarting application
Deployment completed in 1m 14s

Si le build échoue, le site en ligne n'est pas touché : la nouvelle version n'est publiée qu'une fois le build réussi. Il suffit de lire l'erreur dans le journal, de corriger, et de pousser à nouveau.

Les pièges que j'ai rencontrés

Les avertissements SWC. Dans les logs, on peut voir passer de nombreux messages Attempted to load @next/swc-linux-x64-gnu, but an error occurred. Le serveur utilise une version du système trop ancienne pour le compilateur natif de Next.js, qui bascule alors sur sa version WebAssembly. C'est plus lent, mais le résultat est identique : ces messages ne bloquent rien.

Turbopack. Next.js 16 utilise Turbopack par défaut pour le build. Comme il dépend de ces mêmes binaires natifs, je force webpack dans le package.json :

json
"scripts": {
	"build": "next build --webpack"
}

Les images. Comme un vrai serveur Node.js tourne, le composant next/image optimise les images normalement. Pour des images hébergées ailleurs (ici, un sous-domaine dédié), il faut simplement autoriser le domaine dans next.config.js avec remotePatterns.

En résumé

Étape À retenir
Connexion GitHub Une branche de production, déploiement automatique à chaque push
Variables d'environnement Dans hPanel, jamais dans le dépôt ; rebuild pour NEXT_PUBLIC_
Workflow Branche dédiée, build local, puis fusion dans main
Logs de build Le site en ligne reste intact tant que le build échoue
Pièges Avertissements SWC sans gravité, build forcé en webpack

Une fois en place, mettre le site à jour se résume à un git push. C'est exactement ce qu'on attend d'un déploiement : qu'on n'ait plus besoin d'y penser.