← Tous les articles

Comment déployer une app Next.js sur un serveur avec Docker + Nginx

Guide pas-à-pas pour déployer Next.js 14 sur un serveur de déploiement avec Docker, Nginx reverse proxy et HTTPS Certbot. Production-ready en moins d'une heure.

Vercel coûte cher dès que votre site dépasse les 100 000 visites mensuelles. Les serveurs de déploiement coûtent à partir de 5 €/mois et sont capables d'héberger 5 à 10 sites Next.js sans broncher. Voici le guide complet, testé et utilisé en production pour Romdev.

Pré-requis

Étape 1 — Sécuriser le serveur

Connexion SSH initiale en root, puis création d'un utilisateur dédié, désactivation du login root, mise en place d'UFW (firewall) et de Fail2ban pour bloquer les attaques par brute force.

Étape 2 — Installer Docker + Docker Compose

Toujours via le script officiel Docker plutôt que les paquets APT, qui sont souvent en retard de version.

Étape 3 — Dockerfile multi-stage pour Next.js

Le secret d'un build Next.js efficace en Docker : un multi-stage qui sépare les dépendances de la build et du runtime. Image finale légère (~120 Mo), démarrage rapide, et standalone output activé dans `next.config.js`.

Étape 4 — docker-compose.yml minimal

Un service `app` pour Next.js, un service `nginx` qui sert de reverse proxy, et un network bridge partagé pour les faire communiquer. Variables d'env dans un `.env` à la racine.

Étape 5 — Configuration Nginx

Nginx écoute sur 80 et 443, redirige tout HTTP vers HTTPS, et fait du reverse proxy vers `http://app:3000` en interne au réseau Docker. On ajoute aussi les headers de sécurité essentiels et la compression Brotli.

Étape 6 — HTTPS avec Certbot

Deux approches : Certbot standalone (arrêter temporairement Nginx) ou Certbot avec plugin Nginx (plus complexe à containeriser). Pour rester simple en Docker, on installe Certbot sur l'hôte et on monte le dossier `/etc/letsencrypt` dans le container Nginx.

  1. `docker compose stop nginx`
  2. `apt install certbot && certbot certonly --standalone -d romdev.cloud -d www.romdev.cloud`
  3. Monter le volume dans `docker-compose.yml` : `- /etc/letsencrypt:/etc/letsencrypt:ro`
  4. Activer le bloc HTTPS dans `default.conf` et `docker compose up -d`
  5. Cron de renouvellement : `0 3 * * * certbot renew --quiet && docker compose restart nginx`

Étape 7 — CI/CD avec GitHub Actions

Workflow simple : à chaque push sur `main`, GitHub Actions se connecte en SSH au serveur, fait un `git pull` et un `docker compose up -d --build`. Pas besoin de registry Docker privé pour démarrer.

Monitoring minimum

Coût total

Cette config tourne en production pour Romdev depuis 2024 sans incident majeur. Si vous voulez le repo template prêt à cloner, écrivez-moi : je vous l'envoie gratuitement.

Demander le template Docker + Nginx