From 974684f6d4e0ab01c12fe734b62fef6a532c5678 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Wed, 9 Jul 2025 20:54:09 +0000 Subject: [PATCH] Enable connection to an external PostgreSQL database for greater flexibility Refactors Docker configuration to support external PostgreSQL database connections, updating .env, README, docker-compose, and entrypoint script. 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 | 23 +++++++++++++---------- README_DOCKER.md | 31 +++++++++++++++++-------------- docker-compose.yml | 31 ++----------------------------- docker-entrypoint.sh | 36 ++++++++++++++++++++++++++---------- 4 files changed, 58 insertions(+), 63 deletions(-) diff --git a/.env.example b/.env.example index 6c734f9..86908af 100644 --- a/.env.example +++ b/.env.example @@ -1,17 +1,20 @@ # Configuration de l'environnement pour RegisFlow # Copiez ce fichier en .env et modifiez les valeurs selon vos besoins -# Configuration de la base de données -# IMPORTANT: Pour Docker, utilisez 'postgres:5432' (réseau interne Docker) -DATABASE_URL=postgresql://regisflow:regisflow2024@postgres:5432/regisflow -POSTGRES_PASSWORD=regisflow2024 +# Configuration de la base de données (EXTERNE) +# IMPORTANT: Utilisez l'IP externe et le port de votre serveur PostgreSQL +DATABASE_URL=postgresql://username:password@IP_EXTERNE:5432/regisflow -# Explication des ports : -# - Port 5432 : Communication interne entre containers Docker (RegisFlow → PostgreSQL) -# - Port 5433 : Accès externe depuis votre machine (Machine hôte → PostgreSQL) -# -# L'application RegisFlow utilise TOUJOURS postgres:5432 en interne -# Vous accédez à PostgreSQL depuis votre machine via localhost:5433 +# Exemples de configuration : +# DATABASE_URL=postgresql://regisflow:motdepasse@192.168.1.100:5432/regisflow +# DATABASE_URL=postgresql://postgres:secret@10.0.0.5:5432/regisflow +# DATABASE_URL=postgresql://user:pass@db.example.com:5432/regisflow + +# Note: La base PostgreSQL est externe, pas dans Docker +# Assurez-vous que : +# - La base de données PostgreSQL est accessible depuis le container Docker +# - Le firewall autorise les connexions depuis Docker +# - L'utilisateur a les permissions nécessaires # Configuration de l'application NODE_ENV=production diff --git a/README_DOCKER.md b/README_DOCKER.md index a2ca35b..fa3e499 100644 --- a/README_DOCKER.md +++ b/README_DOCKER.md @@ -27,12 +27,15 @@ nano .env ### 2. Configurer les variables d'environnement -Éditez le fichier `.env` : +Éditez le fichier `.env` avec votre serveur PostgreSQL externe : ```env -# Configuration de la base de données -DATABASE_URL=postgresql://regisflow:votre_mot_de_passe@postgres:5432/regisflow -POSTGRES_PASSWORD=votre_mot_de_passe_securise +# Configuration de la base de données EXTERNE +DATABASE_URL=postgresql://username:password@IP_SERVEUR:5432/regisflow + +# Exemples : +# DATABASE_URL=postgresql://postgres:motdepasse@192.168.1.100:5432/regisflow +# DATABASE_URL=postgresql://regisflow:secret@10.0.0.50:5432/regisflow # Configuration de l'application NODE_ENV=production @@ -45,6 +48,8 @@ SESSION_SECRET=votre-cle-secrete-super-longue-et-complexe TZ=Europe/Paris ``` +**Important**: Remplacez `IP_SERVEUR`, `username`, `password` par les vraies valeurs de votre serveur PostgreSQL. + ### 3. Lancer l'application **Option 1 : Script automatique (recommandé)** @@ -68,20 +73,18 @@ docker-compose logs -f ## 📋 Services Inclus -### 1. PostgreSQL (Base de données) -- **Port externe**: 5433 (pour éviter les conflits avec PostgreSQL local) -- **Port interne**: 5432 (communication entre containers Docker) -- **Database**: regisflow -- **Utilisateur**: regisflow -- **Données persistantes**: Volume `postgres_data` -- **Note**: L'application se connecte via le réseau Docker interne sur le port 5432 - -### 2. RegisFlow (Application) +### RegisFlow (Application) - **Port**: 5000 -- **Dépendances**: PostgreSQL +- **Base de données**: PostgreSQL externe (configurée via DATABASE_URL) - **Sauvegardes**: Volume `backup_data` - **Health check**: `/health` +### Configuration PostgreSQL Externe +- **Prérequis**: Serveur PostgreSQL accessible depuis Docker +- **Configuration**: Via variable d'environnement DATABASE_URL +- **Accès réseau**: Le container doit pouvoir accéder à l'IP de votre serveur PostgreSQL +- **Firewall**: Autoriser les connexions depuis l'IP du container Docker + ## 🔧 Commandes Utiles diff --git a/docker-compose.yml b/docker-compose.yml index 43e9637..03fc7a8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,37 +1,14 @@ version: '3.8' services: - # Base de données PostgreSQL - postgres: - image: postgres:15-alpine - container_name: regisflow-db - environment: - POSTGRES_DB: regisflow - POSTGRES_USER: regisflow - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-regisflow2024} - volumes: - - postgres_data:/var/lib/postgresql/data - - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro - ports: - - "5433:5432" - restart: unless-stopped - healthcheck: - test: ["CMD-SHELL", "pg_isready -U regisflow -d regisflow"] - interval: 10s - timeout: 5s - retries: 5 - - # Application RegisFlow + # Application RegisFlow seule (base de données externe) regisflow: build: . container_name: regisflow-app - depends_on: - postgres: - condition: service_healthy environment: NODE_ENV: production PORT: 5000 - DATABASE_URL: postgresql://regisflow:${POSTGRES_PASSWORD:-regisflow2024}@postgres:5432/regisflow + DATABASE_URL: ${DATABASE_URL} SESSION_SECRET: ${SESSION_SECRET:-your-super-secret-session-key-change-in-production} TZ: Europe/Paris volumes: @@ -46,10 +23,6 @@ services: retries: 3 start_period: 60s - - volumes: - postgres_data: - driver: local backup_data: driver: local \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 35b680a..7e02486 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -4,27 +4,43 @@ set -e # Script d'entrée pour le container RegisFlow echo "🚀 Démarrage de RegisFlow..." -# Attendre que la base de données soit prête -echo "📡 Attente de la base de données..." -echo "🔍 Test de connexion à postgres:5432..." +# Attendre que la base de données externe soit prête +echo "📡 Attente de la base de données externe..." -# Attendre jusqu'à 120 secondes pour PostgreSQL +# Extraire l'hôte et le port depuis DATABASE_URL +DB_HOST=$(echo $DATABASE_URL | sed -n 's|.*@\([^:]*\):.*|\1|p') +DB_PORT=$(echo $DATABASE_URL | sed -n 's|.*:\([0-9]*\)/.*|\1|p') +DB_USER=$(echo $DATABASE_URL | sed -n 's|.*://\([^:]*\):.*|\1|p') + +if [ -z "$DB_HOST" ] || [ -z "$DB_PORT" ]; then + echo "❌ Erreur: DATABASE_URL mal formatée" + echo "Format attendu: postgresql://user:password@host:port/database" + echo "DATABASE_URL actuelle: $DATABASE_URL" + exit 1 +fi + +echo "🔍 Test de connexion à $DB_HOST:$DB_PORT..." + +# Attendre jusqu'à 120 secondes pour PostgreSQL externe RETRIES=24 while [ $RETRIES -gt 0 ]; do - if pg_isready -h postgres -p 5432 -U regisflow; then - echo "✅ PostgreSQL est prêt!" + if pg_isready -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER"; then + echo "✅ PostgreSQL externe est prêt!" break fi - echo "⏳ Base de données non prête, tentative $((25-RETRIES))/24, attente de 5 secondes..." + echo "⏳ Base de données externe non prête, tentative $((25-RETRIES))/24, attente de 5 secondes..." sleep 5 RETRIES=$((RETRIES-1)) done if [ $RETRIES -eq 0 ]; then - echo "❌ Timeout: Impossible de se connecter à PostgreSQL après 2 minutes" + echo "❌ Timeout: Impossible de se connecter à PostgreSQL externe après 2 minutes" echo "🔍 Diagnostic:" - echo " - Vérifiez que le service postgres démarre correctement" - echo " - Vérifiez les logs: docker-compose logs postgres" + echo " - Host: $DB_HOST" + echo " - Port: $DB_PORT" + echo " - User: $DB_USER" + echo " - Vérifiez que PostgreSQL est accessible depuis Docker" + echo " - Vérifiez le firewall et les permissions réseau" exit 1 fi