diff --git a/DEPLOYMENT_GUIDE.md b/DEPLOYMENT_GUIDE.md index d7a5876..c74a687 100644 --- a/DEPLOYMENT_GUIDE.md +++ b/DEPLOYMENT_GUIDE.md @@ -117,13 +117,18 @@ docker-compose logs -f #### 1. Erreur "docker-entrypoint.sh: No such file or directory" ```bash -# Solution : Rebuild avec cache vidé +# Solution : Test rapide avec le script fourni +./docker-test-quick.sh + +# Ou manuellement : docker-compose down docker system prune -f docker-compose build --no-cache docker-compose up -d ``` +**RÉSOLU** : Le script d'entrée est maintenant correctement placé dans `/app/docker-entrypoint.sh` + #### 2. Base de données inaccessible ```bash # Vérifier la connexion diff --git a/Dockerfile b/Dockerfile index 98f106d..f6e9cc4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,9 +61,10 @@ COPY --from=builder --chown=regisflow:nodejs /build/dist/public ./public RUN npm cache clean --force && \ rm -rf /tmp/* -# Copier les scripts de configuration -COPY --chown=regisflow:nodejs docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh -RUN chmod +x /usr/local/bin/docker-entrypoint.sh +# Copier le script d'entrée directement dans /app (accessible) +COPY docker-entrypoint.sh /app/docker-entrypoint.sh +RUN chmod +x /app/docker-entrypoint.sh && \ + chown regisflow:nodejs /app/docker-entrypoint.sh # Changer vers l'utilisateur non-root USER regisflow @@ -86,8 +87,5 @@ LABEL description="Application RegisFlow pour la gestion des ventes de feux d'ar HEALTHCHECK --interval=30s --timeout=15s --start-period=90s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:5000/health || exit 1 -# Utiliser dumb-init pour gérer les signaux -ENTRYPOINT ["dumb-init", "--"] - -# Démarrer avec le script d'entrée -CMD ["docker-entrypoint.sh"] \ No newline at end of file +# Utiliser dumb-init pour gérer les signaux et lancer le script depuis /app +ENTRYPOINT ["dumb-init", "--", "/app/docker-entrypoint.sh"] \ No newline at end of file diff --git a/Dockerfile.fixed b/Dockerfile.fixed new file mode 100644 index 0000000..32359f7 --- /dev/null +++ b/Dockerfile.fixed @@ -0,0 +1,91 @@ +# Dockerfile multi-stage pour RegisFlow Production - Version Corrigée +# Stage 1: Build +FROM node:20-alpine AS builder + +# Installer les dépendances de build +RUN apk add --no-cache python3 make g++ git + +# Créer le répertoire de build +WORKDIR /build + +# Copier les fichiers de dépendances +COPY package*.json ./ + +# Installer toutes les dépendances (dev + prod) +RUN npm ci --include=dev --prefer-offline + +# Copier le code source complet +COPY . . + +# Construire l'application client et serveur +RUN npm run build + +# Vérifier que les fichiers de build existent +RUN ls -la dist/ && test -f dist/index.js + +# Stage 2: Production +FROM node:20-alpine AS production + +# Installer uniquement les dépendances système nécessaires pour production +RUN apk add --no-cache \ + dumb-init \ + postgresql-client \ + wget \ + curl \ + bash \ + && rm -rf /var/cache/apk/* + +# Créer un utilisateur non-root avec des permissions limitées +RUN addgroup -g 1001 -S nodejs && \ + adduser -S regisflow -u 1001 -G nodejs + +# Créer les répertoires avec permissions appropriées +WORKDIR /app +RUN mkdir -p /app/backups /app/logs /app/data && \ + chown -R regisflow:nodejs /app + +# Copier uniquement les fichiers nécessaires depuis le builder +COPY --from=builder --chown=regisflow:nodejs /build/package*.json ./ +COPY --from=builder --chown=regisflow:nodejs /build/dist ./dist +COPY --from=builder --chown=regisflow:nodejs /build/shared ./shared +COPY --from=builder --chown=regisflow:nodejs /build/drizzle.config.ts ./ +COPY --from=builder --chown=regisflow:nodejs /build/init.sql ./ + +# Installer uniquement les dépendances de production +RUN npm ci --omit=dev --prefer-offline + +# Copier les assets client au bon endroit pour serveStatic +COPY --from=builder --chown=regisflow:nodejs /build/dist/public ./public + +# Nettoyer le cache npm +RUN npm cache clean --force && \ + rm -rf /tmp/* + +# Copier le script d'entrée directement dans /app (accessible) +COPY docker-entrypoint.sh /app/docker-entrypoint.sh +RUN chmod +x /app/docker-entrypoint.sh && \ + chown regisflow:nodejs /app/docker-entrypoint.sh + +# Changer vers l'utilisateur non-root +USER regisflow + +# Exposer le port +EXPOSE 5000 + +# Variables d'environnement de production +ENV NODE_ENV=production +ENV PORT=5000 +ENV NODE_OPTIONS="--max-old-space-size=768" +ENV TZ=Europe/Paris + +# Labels pour la documentation +LABEL maintainer="RegisFlow Team" +LABEL version="1.0.0" +LABEL description="Application RegisFlow pour la gestion des ventes de feux d'artifice" + +# Health check amélioré +HEALTHCHECK --interval=30s --timeout=15s --start-period=90s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:5000/health || exit 1 + +# Utiliser dumb-init pour gérer les signaux et lancer le script depuis /app +ENTRYPOINT ["dumb-init", "--", "/app/docker-entrypoint.sh"] \ No newline at end of file diff --git a/docker-test-quick.sh b/docker-test-quick.sh new file mode 100755 index 0000000..00f1668 --- /dev/null +++ b/docker-test-quick.sh @@ -0,0 +1,63 @@ +#!/bin/bash +set -e + +echo "🐳 RegisFlow Docker Quick Test" +echo "==============================" + +# Nettoyer les anciens containers +echo "🧹 Cleaning up existing containers..." +docker-compose down -v 2>/dev/null || true +docker system prune -f >/dev/null 2>&1 || true + +# Test de build +echo "🔨 Building fresh Docker image..." +if docker-compose build --no-cache regisflow; then + echo "✅ Build successful" +else + echo "❌ Build failed" + exit 1 +fi + +# Créer .env.production si nécessaire +if [[ ! -f ".env.production" ]]; then + echo "📝 Creating .env.production from example..." + cp .env.production.example .env.production +fi + +# Test de démarrage +echo "🚀 Starting containers..." +if docker-compose up -d; then + echo "✅ Containers started" + + # Attendre l'application + echo "⏳ Waiting for application..." + for i in {1..30}; do + if curl -s http://localhost:5000/health >/dev/null 2>&1; then + echo "✅ Application is responding!" + echo "🏥 Health: $(curl -s http://localhost:5000/health | grep -o '"status":"[^"]*"' || echo 'OK')" + break + fi + echo " Attempt $i/30..." + sleep 2 + done + + if [ $i -eq 30 ]; then + echo "❌ Application timeout" + echo "📋 Recent logs:" + docker-compose logs --tail=10 regisflow + exit 1 + fi + +else + echo "❌ Container startup failed" + exit 1 +fi + +echo "" +echo "🎉 SUCCESS! RegisFlow is running" +echo "================================" +echo "Access: http://localhost:5000" +echo "Admin: admin / admin123" +echo "" +echo "To stop: docker-compose down" +echo "To see logs: docker-compose logs -f" \ No newline at end of file