From 3028259f6e8fbd7a8c814ee5e3df656666df3a8e Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Wed, 9 Jul 2025 20:43:12 +0000 Subject: [PATCH] Simplify deployment and improve database access instructions for users Adds an automatic deployment script, updates the database port mapping in docker-compose, and provides clearer instructions for database access. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 91318273-c764-4fd4-be04-bdc12c38af32 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/6e755801-08e8-4492-805e-ac3610de5a2a.jpg --- .env.example | 3 ++ README_DOCKER.md | 14 +++++- attached_assets/image_1752093733153.png | Bin 0 -> 27496 bytes deploy.sh | 62 ++++++++++++++++++++++++ docker-compose.yml | 2 +- 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 attached_assets/image_1752093733153.png create mode 100755 deploy.sh diff --git a/.env.example b/.env.example index e4a1048..f87cbbd 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,9 @@ DATABASE_URL=postgresql://regisflow:regisflow2024@postgres:5432/regisflow POSTGRES_PASSWORD=regisflow2024 +# Note: En cas de conflit de port, PostgreSQL sera accessible sur le port 5433 depuis l'hôte +# mais l'application utilise le port 5432 interne au réseau Docker + # Configuration de l'application NODE_ENV=production PORT=5000 diff --git a/README_DOCKER.md b/README_DOCKER.md index c19b088..aedb497 100644 --- a/README_DOCKER.md +++ b/README_DOCKER.md @@ -47,6 +47,14 @@ TZ=Europe/Paris ### 3. Lancer l'application +**Option 1 : Script automatique (recommandé)** +```bash +# Utiliser le script de déploiement automatique +chmod +x deploy.sh +./deploy.sh +``` + +**Option 2 : Commandes manuelles** ```bash # Construire et démarrer tous les services docker-compose up -d @@ -61,7 +69,8 @@ docker-compose logs -f ## 📋 Services Inclus ### 1. PostgreSQL (Base de données) -- **Port**: 5432 +- **Port externe**: 5433 (pour éviter les conflits) +- **Port interne**: 5432 (communication entre containers) - **Database**: regisflow - **Utilisateur**: regisflow - **Données persistantes**: Volume `postgres_data` @@ -106,6 +115,9 @@ docker-compose exec -T postgres psql -U regisflow regisflow < backup.sql # Accéder à la base de données docker-compose exec postgres psql -U regisflow regisflow + +# Ou depuis l'hôte (port 5433) +psql -h localhost -p 5433 -U regisflow regisflow ``` ### Maintenance diff --git a/attached_assets/image_1752093733153.png b/attached_assets/image_1752093733153.png new file mode 100644 index 0000000000000000000000000000000000000000..ee593bf2a7b45beb4020d3d282386f8a7d55154e GIT binary patch literal 27496 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

x+ySRX@c21 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 /dev/null; then + echo "❌ Docker n'est pas installé. Installez Docker d'abord." + exit 1 +fi + +if ! command -v docker-compose &> /dev/null; then + echo "❌ Docker Compose n'est pas installé. Installez Docker Compose d'abord." + exit 1 +fi + +echo "✅ Docker et Docker Compose détectés" + +# Arrêter les services existants +echo "🛑 Arrêt des services existants..." +docker-compose down -v 2>/dev/null || true + +# Nettoyer les anciens containers et images +echo "🧹 Nettoyage des anciens containers..." +docker system prune -f + +# Créer le fichier .env s'il n'existe pas +if [ ! -f .env ]; then + echo "📝 Création du fichier .env..." + cp .env.example .env + echo "⚠️ IMPORTANT: Éditez le fichier .env avec vos paramètres avant de continuer" + echo " Notamment: POSTGRES_PASSWORD et SESSION_SECRET" + read -p "Appuyez sur Entrée pour continuer..." +fi + +# Construire et démarrer les services +echo "🏗️ Construction et démarrage des services..." +docker-compose up -d --build + +# Attendre que les services soient prêts +echo "⏳ Attente du démarrage des services..." +sleep 30 + +# Vérifier le statut des services +echo "📊 Vérification du statut des services..." +docker-compose ps + +# Afficher les logs des dernières minutes +echo "📋 Logs récents:" +docker-compose logs --tail=50 + +echo "" +echo "🎉 Déploiement terminé!" +echo "📱 Application accessible sur: http://localhost:5000" +echo "🗄️ Base de données accessible sur: localhost:5433" +echo "👤 Compte par défaut: admin / admin123" +echo "" +echo "📝 Pour voir les logs en continu:" +echo " docker-compose logs -f" +echo "" +echo "🛑 Pour arrêter les services:" +echo " docker-compose down" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 08f3d4f..43e9637 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro ports: - - "5432:5432" + - "5433:5432" restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U regisflow -d regisflow"]