Dockerfile

This commit is contained in:
corenthin-lebreton 2026-02-26 22:07:18 +01:00
parent a376e5d5de
commit 89757b3c88
3 changed files with 136 additions and 0 deletions

47
.dockerignore Normal file
View File

@ -0,0 +1,47 @@
# Dépendances — réinstallées dans le conteneur
node_modules
.pnp
.pnp.js
# Artefacts de build
.next
out
dist
# Outils de dev
.git
.gitignore
.github
.vscode
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Secrets locaux — jamais dans l'image
.env
.env.*
!.env.example
!.env.local.example
# Tests / CI
coverage
.nyc_output
__tests__
*.test.ts
*.spec.ts
# Docs
*.md
!README.md
# Docker
Dockerfile
.dockerignore
# Supabase
supabase/
# Divers
.DS_Store
Thumbs.db

88
Dockerfile Normal file
View File

@ -0,0 +1,88 @@
# ─────────────────────────────────────────────────────────────
# Étape 1 — Installation des dépendances
# ─────────────────────────────────────────────────────────────
FROM node:20-alpine AS deps
# Mise à jour des paquets système (sécurité)
RUN apk update && apk upgrade --no-cache && apk add --no-cache libc6-compat
WORKDIR /app
# Copier uniquement les manifestes de dépendances
COPY package.json package-lock.json* ./
# Installation des dépendances de production + dev (nécessaires au build)
RUN npm ci --frozen-lockfile
# ─────────────────────────────────────────────────────────────
# Étape 2 — Build de l'application
# ─────────────────────────────────────────────────────────────
FROM node:20-alpine AS builder
RUN apk update && apk upgrade --no-cache
WORKDIR /app
# Récupération des node_modules depuis l'étape précédente
COPY --from=deps /app/node_modules ./node_modules
# Copie des sources
COPY . .
# Variables d'environnement publiques nécessaires au build Next.js
# (uniquement les NEXT_PUBLIC_* — les secrets restent hors image)
ARG NEXT_PUBLIC_SUPABASE_URL
ARG NEXT_PUBLIC_SUPABASE_ANON_KEY
ENV NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \
NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY
# Désactiver la télémétrie Next.js
ENV NEXT_TELEMETRY_DISABLED=1
RUN npm run build
# ─────────────────────────────────────────────────────────────
# Étape 3 — Image de production (minimale et durcissable)
# ─────────────────────────────────────────────────────────────
FROM node:20-alpine AS runner
# Mise à jour des paquets système
RUN apk update && apk upgrade --no-cache
WORKDIR /app
# Créer un utilisateur non-root dédié
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
# Copier les fichiers statiques publics
COPY --from=builder /app/public ./public
# Next.js standalone — crée un dossier .next/standalone optimisé
# Copier le serveur standalone
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
# Copier les assets statiques compilés
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
# Passer sur l'utilisateur non-root
USER nextjs
# Variables d'environnement de runtime par défaut
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
PORT=3000 \
HOSTNAME="0.0.0.0"
# Les secrets (SUPABASE_SERVICE_ROLE_KEY, etc.) sont injectés
# au moment du déploiement via --env-file ou les secrets du
# gestionnaire de déploiement — jamais dans l'image.
EXPOSE 3000
# Healthcheck : vérifie que l'app répond bien
HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
CMD wget -qO- http://localhost:3000/ | grep -q "html" || exit 1
CMD ["node", "server.js"]

View File

@ -1,6 +1,7 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
output: "standalone",
images: {
remotePatterns: [
{