Déploiement — PHI Conseil
Cible
Application Node.js (next start) derrière un reverse proxy TLS. Aucune base de données. Le build est statique pour toutes les pages ; seule POST /api/contact s'exécute à la demande.
| Besoin | Valeur |
|---|---|
| Node.js | ≥ 20 (testé 26) |
| RAM | ~150 Mo au repos |
| Port | PORT (défaut 3000) |
| Fichiers | .next/, public/, content/, node_modules/, package.json |
Variables d'environnement
Voir .env.example. En production :
NEXT_PUBLIC_SITE_URL— URL publique (canonical, sitemap, OG). Inlinée au build : rebuild si elle change.NEXT_PUBLIC_CONTENT_PREVIEW—0en production.1affiche les témoignages de maquette avec un bandeau « exemple non vérifié » (sites de démonstration uniquement ; inlinée au build).CONTACT_TRANSPORT=smtp+CONTACT_TO,CONTACT_FROM,SMTP_HOST,SMTP_PORT,SMTP_SECURE,SMTP_USER,SMTP_PASS— sans ces valeurs le formulaire fonctionne mais n'envoie aucun courriel (CONTACT_TRANSPORT=log) et l'utilisateur en est informé dans l'écran de confirmation.CONTACT_RATE_LIMIT/CONTACT_RATE_WINDOW_S— anti-abus (défaut 5 / 600 s par IP). Le limiteur est en mémoire : valable pour une instance unique (PM2fork). Pour plusieurs instances, brancher Redis danssrc/lib/security.ts.
Le proxy doit transmettre X-Forwarded-For (Caddy et nginx le font par défaut) pour que la limitation par IP soit correcte.
Procédure générique (VPS / serveur Node)
git clone <dépôt> phi-conseil && cd phi-conseil
pnpm install --frozen-lockfile
cp .env.example .env.local && $EDITOR .env.local
pnpm build
pm2 start pnpm --name phi-conseil -- start -p 3000 # ou systemdReverse proxy (exemple Caddy) : phiconseil.example { reverse_proxy 127.0.0.1:3000 } — Caddy obtient et renouvelle le certificat TLS automatiquement. HSTS est déjà émis par l'application.
Vercel (alternative)
Importer le dépôt, définir les variables d'environnement, framework Next.js détecté automatiquement. Le limiteur en mémoire n'est pas fiable en serverless : remplacer par Upstash/Redis ou le middleware de limitation du fournisseur.
Procédure MacLustr (mld) — site de démonstration test.spboucher.ai
- Manifeste
M1M32:~/dispatch/apps/phi-conseil.json(dir~/apps/phi-conseil, PM2pnpm start -p 8520,tunnel.domain = test.spboucher.ai, hookspost_sync:pnpm install --frozen-lockfile && pnpm build). mld stage ~/Desktop/phi-conseil phi-conseilpuismld deploy phi-conseil.- DNS GoDaddy
A test.spboucher.ai → 51.161.112.61(passerelle BHS64) — déjà en place ;mldpose la route Caddy et vérifie la santé publique. - Mises à jour : modifier sur le nœud (clone git),
pnpm build && pm2 restart phi-conseil, puisgit commit/pushdepuis le nœud (règle remote-first MacLustr).
Sauvegardes et restauration
- Le code et le contenu (
content/*.json) sont versionnés dans Git : la sauvegarde est le dépôt distant. Restaurer =git checkout <tag>+pnpm install && pnpm build. - Les messages du formulaire ne sont pas stockés par le site : ils vivent dans la boîte courriel destinataire (sauvegarde relevant du fournisseur de messagerie).
- Secrets (
.env.local) : conserver une copie chiffrée hors du dépôt (gestionnaire de mots de passe).
Retour arrière
git log→ identifier la dernière version saine (chaque mise en production est taguéevX.Y.Z).git checkout vX.Y.Z && pnpm install --frozen-lockfile && pnpm build && pm2 restart phi-conseil.- Vérifier
GET /(200) etGET /api/contact(405 attendu) ; sur MacLustr,mld status --live phi-conseil.
Surveillance minimale
- Santé :
GET /doit répondre 200 (healthcheck PM2/mld). - Journaux :
pm2 logs phi-conseil— les lignes[contact]ne contiennent qu'une empreinte d'IP, jamais le contenu des messages. - Erreurs de rendu : digest côté serveur (
console.error) corrélable à l'écran d'erreur client. Un service d'erreurs (Sentry…) peut être ajouté danssrc/app/error.tsxetinstrumentation.ts; non inclus par défaut pour éviter tout traceur non consenti.
Mise à jour des dépendances
pnpm outdated puis pnpm update --latest en suivant les notes de migration de Next.js ; relancer pnpm check et pnpm test:e2e avant mise en production. Audit : pnpm audit.