Deux problèmes ont été identifiés et corrigés :
1. Le fichier .dockerignore excluait package-lock.json, ce qui empêchait
npm ci de fonctionner (npm ci nécessite package-lock.json)
2. L'image Alpine n'incluait pas les outils de build nécessaires pour
compiler les modules natifs Node.js (bcrypt, sqlite3)
Changements :
- Suppression de package-lock.json du .dockerignore
- Ajout de python3, make et g++ dans les deux stages du Dockerfile
pour permettre la compilation des modules natifs
Correction du Dockerfile pour résoudre l'erreur de build au stage de production.
Problème:
- npm ci --only=production échouait car package.json contient maintenant
toutes les dépendances React/Vite dans "dependencies"
- Ces dépendances sont nécessaires pour le build mais causent une erreur
avec --only=production
Solution:
- Retrait du flag --only=production
- Installation de toutes les dépendances dans l'image de production
- Les dépendances frontend ne seront pas utilisées en runtime (seul le serveur tourne)
- L'image sera légèrement plus grosse mais fonctionnelle
Note: Seules les dépendances backend (express, sqlite3, bcrypt, etc.)
sont utilisées en runtime. Les deps React restent inutilisées dans l'image.
Configuration de l'application pour le build et déploiement React:
Package.json:
- Ajout de toutes les dépendances React/TypeScript/Vite
- Ajout des dépendances shadcn/ui et Radix UI
- Ajout des scripts de build (dev, build, preview)
- Dépendances ajoutées: react, react-dom, @tanstack/react-query,
react-router-dom, tailwindcss, vite, typescript, lucide-react,
sonner, next-themes, et toutes les primitives @radix-ui
Vite.config.ts:
- Configuration du build pour générer dans le dossier dist/
- Configuration correcte de l'alias @ pour les imports
Server.js:
- Modification pour servir les fichiers statiques depuis dist/
- Maintien du dossier /uploads depuis public/uploads
- SPA fallback pour servir dist/index.html
Dockerfile:
- Multi-stage build pour optimiser la taille
- Stage 1 (builder): Installation des dépendances et build React
- Stage 2 (production): Copie du build + dépendances serveur uniquement
- Réduction significative de la taille de l'image finale
.dockerignore:
- Nouveau fichier pour exclure les fichiers inutiles du contexte Docker
- Exclusion de node_modules, dist, .git, logs, etc.
L'application est maintenant prête pour le déploiement avec Docker.
Modifications:
- docker-compose.yml: port mapping 2222:2222 et variable PORT=2222
- Dockerfile: EXPOSE 2222 et healthcheck sur port 2222
- server.js: port par défaut changé de 3000 à 2222
- .env.example: PORT=2222
- README.md: toutes les références au port 3000 remplacées par 2222
(installation, accès, configuration Nginx)
L'application écoute maintenant sur le port 2222 au lieu de 3000.