From a49db6e4ae2d81c0d73ea610a07d90ac12d7db3d Mon Sep 17 00:00:00 2001 From: mahek Date: Fri, 25 Jul 2025 17:11:07 +0200 Subject: [PATCH] docker --- DOCKER.md | 93 +++++++++++++++++++++++++++++++++++++ README.md | 5 ++ backend/Dockerfile | 8 +++- backend/wait-for-mongodb.sh | 9 ++++ docker-compose.simple.yml | 70 ++++++++++++++++++++++++++++ docker-compose.yml | 9 ++-- docker-manage.sh | 27 +++++++---- mongodb/Dockerfile | 15 ++++++ mongodb/healthcheck.sh | 10 ++++ 9 files changed, 228 insertions(+), 18 deletions(-) create mode 100644 DOCKER.md create mode 100644 backend/wait-for-mongodb.sh create mode 100644 docker-compose.simple.yml create mode 100644 mongodb/Dockerfile create mode 100644 mongodb/healthcheck.sh diff --git a/DOCKER.md b/DOCKER.md new file mode 100644 index 0000000..efb4b73 --- /dev/null +++ b/DOCKER.md @@ -0,0 +1,93 @@ +# Guide d'utilisation de Docker avec Managerr + +Ce document explique comment utiliser Docker pour exécuter l'application Managerr. + +## Prérequis + +- Docker installé sur votre machine +- Docker Compose installé sur votre machine + +## Commandes de base + +### Démarrage standard + +```bash +./docker-manage.sh start +``` + +Cette commande démarre tous les services (MongoDB, backend et frontend) avec la configuration standard qui inclut des healthchecks pour s'assurer que MongoDB est prêt avant de démarrer le backend. + +### Démarrage simplifié (en cas de problème) + +Si vous rencontrez l'erreur "dependency failed to start: container managerr-mongodb is unhealthy", utilisez cette commande : + +```bash +./docker-manage.sh start:simple +``` + +Cette commande utilise une configuration simplifiée sans healthcheck, ce qui peut résoudre les problèmes de démarrage. + +### Arrêt des services + +```bash +./docker-manage.sh stop +``` + +### Afficher l'état des services + +```bash +./docker-manage.sh status +``` + +### Afficher les logs + +```bash +# Tous les services +./docker-manage.sh logs + +# Seulement le frontend +./docker-manage.sh logs:front + +# Seulement le backend +./docker-manage.sh logs:back + +# Seulement MongoDB +./docker-manage.sh logs:db +``` + +## Résolution des problèmes + +### Erreur : "dependency failed to start: container managerr-mongodb is unhealthy" + +Cette erreur se produit généralement lorsque le healthcheck de MongoDB échoue. Plusieurs solutions sont possibles : + +1. Utilisez la commande de démarrage simplifiée : + ```bash + ./docker-manage.sh start:simple + ``` + +2. Si vous avez déjà essayé de démarrer les conteneurs, nettoyez d'abord : + ```bash + docker-compose down + ``` + +3. Si le problème persiste, vérifiez les logs de MongoDB : + ```bash + docker logs managerr-mongodb + ``` + +4. Assurez-vous que le port 27017 est libre sur votre machine : + ```bash + sudo lsof -i :27017 + ``` + Si un autre service utilise ce port, arrêtez-le ou modifiez le port dans docker-compose.yml. + +### Problème de connexion depuis le backend vers MongoDB + +Si le backend ne parvient pas à se connecter à MongoDB, vérifiez que l'URL de connexion est correcte dans le fichier `.env` du backend et dans docker-compose.yml. Dans le contexte Docker, l'URL doit être : + +``` +mongodb://root:rootpassword@mongodb:27017/managerr?authSource=admin +``` + +Notez que l'hôte est `mongodb` (le nom du service dans docker-compose.yml) et non `localhost`. diff --git a/README.md b/README.md index 05d1942..e7079a0 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,9 @@ L'application peut également être exécutée dans des conteneurs Docker, ce qu # Démarrer tous les services (MongoDB, backend et frontend) ./docker-manage.sh start +# En cas d'erreur, utilisez la version simplifiée +./docker-manage.sh start:simple + # Afficher l'état des services ./docker-manage.sh status @@ -135,6 +138,8 @@ L'application peut également être exécutée dans des conteneurs Docker, ce qu L'application sera accessible à l'adresse : http://localhost:8012 +Pour plus d'informations sur l'utilisation avec Docker et la résolution des problèmes, consultez le fichier [DOCKER.md](DOCKER.md). + ## Déploiement ### Backend diff --git a/backend/Dockerfile b/backend/Dockerfile index feb3fef..eda3afd 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -14,5 +14,9 @@ COPY . . # Expose port 5000 EXPOSE 5000 -# Start the application -CMD ["npm", "run", "dev"] +# Add wait-for script +COPY wait-for-mongodb.sh /wait-for-mongodb.sh +RUN chmod +x /wait-for-mongodb.sh + +# Start the application with wait script +CMD ["/wait-for-mongodb.sh", "npm", "run", "dev"] diff --git a/backend/wait-for-mongodb.sh b/backend/wait-for-mongodb.sh new file mode 100644 index 0000000..d232121 --- /dev/null +++ b/backend/wait-for-mongodb.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# wait-for-mongodb.sh + +set -e + +echo "Attente de MongoDB..." +sleep 10 # Attente simple pour s'assurer que MongoDB a démarré +echo "Démarrage de l'application backend..." +exec "$@" diff --git a/docker-compose.simple.yml b/docker-compose.simple.yml new file mode 100644 index 0000000..7b56720 --- /dev/null +++ b/docker-compose.simple.yml @@ -0,0 +1,70 @@ +version: '3.8' + +services: + # Service MongoDB + mongodb: + image: mongo:latest + container_name: managerr-mongodb + restart: unless-stopped + volumes: + - mongodb-data:/data/db + environment: + - MONGO_INITDB_ROOT_USERNAME=root + - MONGO_INITDB_ROOT_PASSWORD=rootpassword + - MONGO_INITDB_DATABASE=managerr + ports: + - "27017:27017" + networks: + - managerr-network + + # Service Backend + backend: + build: + context: ./backend + dockerfile: Dockerfile + container_name: managerr-backend + restart: unless-stopped + depends_on: + - mongodb + environment: + - NODE_ENV=development + - PORT=5000 + - MONGODB_URI=mongodb://root:rootpassword@mongodb:27017/managerr?authSource=admin + - JWT_SECRET=secret_jwt_pour_managerr + ports: + - "5000:5000" + volumes: + - ./backend:/app + - /app/node_modules + networks: + - managerr-network + + # Service Frontend + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + container_name: managerr-frontend + restart: unless-stopped + depends_on: + - backend + environment: + - NODE_ENV=development + - VUE_APP_API_URL=http://localhost:5000/api + ports: + - "8012:8012" + volumes: + - ./frontend:/app + - /app/node_modules + networks: + - managerr-network + +# Volumes +volumes: + mongodb-data: + driver: local + +# Networks +networks: + managerr-network: + driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml index df794b5..c12bf0e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,9 @@ version: '3.8' services: # Service MongoDB mongodb: - image: mongo:latest + build: + context: ./mongodb + dockerfile: Dockerfile container_name: managerr-mongodb restart: unless-stopped volumes: @@ -16,11 +18,6 @@ services: - "27017:27017" networks: - managerr-network - healthcheck: - test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] - interval: 10s - timeout: 10s - retries: 5 # Service Backend backend: diff --git a/docker-manage.sh b/docker-manage.sh index 5d3d698..68b5c01 100755 --- a/docker-manage.sh +++ b/docker-manage.sh @@ -5,16 +5,17 @@ show_help() { echo "Usage: $0 [option]" echo "Options:" - echo " start - Démarre tous les services" - echo " stop - Arrête tous les services" - echo " restart - Redémarre tous les services" - echo " status - Affiche l'état des services" - echo " logs - Affiche les logs de tous les services" - echo " logs:front - Affiche les logs du frontend" - echo " logs:back - Affiche les logs du backend" - echo " logs:db - Affiche les logs de la base de données" - echo " build - Reconstruit les images Docker" - echo " help - Affiche cette aide" + echo " start - Démarre tous les services avec la configuration standard" + echo " start:simple - Démarre tous les services avec la configuration simplifiée (sans healthcheck)" + echo " stop - Arrête tous les services" + echo " restart - Redémarre tous les services" + echo " status - Affiche l'état des services" + echo " logs - Affiche les logs de tous les services" + echo " logs:front - Affiche les logs du frontend" + echo " logs:back - Affiche les logs du backend" + echo " logs:db - Affiche les logs de la base de données" + echo " build - Reconstruit les images Docker" + echo " help - Affiche cette aide" } # Si aucun argument n'est fourni, afficher l'aide @@ -30,6 +31,12 @@ case "$1" in docker-compose up -d echo "Services démarrés ! L'application est accessible sur http://localhost:8012" ;; + start:simple) + echo "Démarrage des services avec la configuration simplifiée..." + docker-compose -f docker-compose.simple.yml up -d + echo "Services démarrés ! L'application est accessible sur http://localhost:8012" + echo "Note: Cette configuration n'utilise pas de healthcheck pour MongoDB." + ;; stop) echo "Arrêt des services..." docker-compose down diff --git a/mongodb/Dockerfile b/mongodb/Dockerfile new file mode 100644 index 0000000..52741ef --- /dev/null +++ b/mongodb/Dockerfile @@ -0,0 +1,15 @@ +FROM mongo:latest + +# Installation d'outils pour le healthcheck +RUN apt-get update && apt-get install -y --no-install-recommends \ + netcat \ + && rm -rf /var/lib/apt/lists/* + +# Script de healthcheck +COPY healthcheck.sh /healthcheck.sh +RUN chmod +x /healthcheck.sh + +HEALTHCHECK --interval=10s --timeout=10s --start-period=30s --retries=5 \ + CMD ["/healthcheck.sh"] + +EXPOSE 27017 diff --git a/mongodb/healthcheck.sh b/mongodb/healthcheck.sh new file mode 100644 index 0000000..362f32a --- /dev/null +++ b/mongodb/healthcheck.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# healthcheck.sh pour MongoDB + +# Attente que le port MongoDB soit ouvert +nc -z localhost 27017 || exit 1 + +# Ping MongoDB pour confirmer qu'il fonctionne +mongo --quiet --eval "db.adminCommand('ping')" || exit 1 + +exit 0