iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
Formations
Vue · Intermédiaire

OpenFolio

Construire un portfolio open-source moderne avec Nuxt 3 — thèmes CSS, données JSON, SEO automatique, et déploiement Docker.

Nuxt 3Vue 3TypeScriptTailwind CSSDocker
GitHub
01Setup et configuration02Structure et routing Nuxt 303Données JSON et composables04Système de thèmes CSS05Pages et composants06SEO et performances07Déploiement Docker et Vercel
Chapitre 7·20 min

Déploiement Docker et Vercel

OpenFolio supporte deux modes de déploiement : Docker sur un VPS, ou Vercel/Netlify pour du serverless. Les deux partent du même code.

Docker — déploiement VPS

Le Dockerfile inclus dans le repo utilise une build multi-étapes pour minimiser la taille de l'image finale.

Dockerfile
# Étape 1 — build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
 
# Étape 2 — image finale
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/.output ./output
ENV HOST=0.0.0.0
ENV PORT=3000
EXPOSE 3000
CMD ["node", "output/server/index.mjs"]

npm run build avec Nuxt génère .output/ — un dossier autonome qui contient tout : le serveur Node, les assets statiques, et les chunks JavaScript. Aucune dépendance node_modules à copier dans l'image finale.

Build et run

Terminal
# Build l'image
docker build -t openfolio .
 
# Run en local
docker run -p 3000:3000 openfolio
 
# Run en production (restart automatique)
docker run -d --restart unless-stopped -p 3000:3000 --name openfolio openfolio

-d detache le conteneur. --restart unless-stopped le relance automatiquement si le serveur redémarre.

Docker Compose

Si le VPS héberge plusieurs services (Nginx, base de données...) :

docker-compose.yml
services:
  openfolio:
    build: .
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
Terminal
docker compose up -d

Nginx en reverse proxy

En production, Nginx fait le SSL et redirige vers le conteneur :

/etc/nginx/sites-available/openfolio
server {
  listen 80;
  server_name votre-domaine.com;
  return 301 https://$server_name$request_uri;
}
 
server {
  listen 443 ssl;
  server_name votre-domaine.com;
 
  ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem;
 
  location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

Certbot génère le certificat SSL Let's Encrypt gratuitement :

Terminal
certbot --nginx -d votre-domaine.com

Vercel — déploiement serverless

Pour Vercel, changer le preset dans nuxt.config.ts :

nuxt.config.ts
nitro: {
  preset: 'vercel',
},

Puis pusher sur GitHub et connecter le repo dans le dashboard Vercel. Le build se lance automatiquement à chaque push sur main.

Vercel détecte Nuxt automatiquement — aucune configuration supplémentaire.

Netlify

nuxt.config.ts
nitro: {
  preset: 'netlify',
},

Créer un fichier netlify.toml à la racine :

netlify.toml
[build]
  command = "npm run build"
  publish = ".output/public"
 
[build.environment]
  NODE_VERSION = "20"

Mettre à jour le portfolio

Avec Docker sur VPS, le workflow de mise à jour est :

Terminal
git pull
docker build -t openfolio .
docker stop openfolio
docker rm openfolio
docker run -d --restart unless-stopped -p 3000:3000 --name openfolio openfolio

Ou avec Docker Compose :

Terminal
git pull
docker compose up -d --build

--build force la reconstruction de l'image même si le Dockerfile n'a pas changé.

Mettre à jour le contenu sans redéployer

Puisque les JSON sont dans /public/data/, ils sont servis comme fichiers statiques. Sur un VPS, on peut modifier un JSON directement sur le serveur et les visiteurs voient la mise à jour au prochain rafraîchissement — sans rebuild Docker.

Terminal
# Éditer un projet directement sur le serveur
ssh user@votre-serveur
vim /chemin/vers/OpenFolio/public/data/projects.json

C'est l'un des avantages du modèle "pas de base de données" : le contenu est juste des fichiers.

Précédent
SEO et performances

Développeur fullstack passionné. J'apprends en construisant et je documente tout — front, back, outils. Le code s'apprend mieux en public.

Naviguer

IndexTous les articlesFormationsProfilOutilsBibliothech

Ailleurs

GitHub RSS

Newsletter

Les articles, libs et découvertes. Une fois par semaine, pas plus.

© 2026 William LoreeConçu & codé à la main