diff --git a/.env.example b/.env.example index 75abf5c..347abd5 100644 --- a/.env.example +++ b/.env.example @@ -1,22 +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 (EXTERNE) -# PRÉCONFIGURÉE - Changez seulement l'IP de votre serveur PostgreSQL -DATABASE_URL=postgresql://regisflow:RegisFlow2024!@192.168.1.100:5433/regisflow +# Configuration de la base de données (DOCKER INTERNE) +# PRÉCONFIGURÉE - PostgreSQL et RegisFlow dans Docker +# Communication via nom de container : regisflow-db:5432 -# Configuration standard préconfigurée : -# - Utilisateur: regisflow +# Configuration PostgreSQL +POSTGRES_PASSWORD=RegisFlow2024! + +# Configuration automatique (NE PAS CHANGER) : +# - Container PostgreSQL : regisflow-db +# - Utilisateur: regisflow # - Mot de passe: RegisFlow2024! # - Base de données: regisflow -# - Port: 5433 -# -# SEULE MODIFICATION NÉCESSAIRE: Remplacez 192.168.1.100 par l'IP de votre serveur PostgreSQL -# -# Instructions pour votre serveur PostgreSQL : -# 1. Créer l'utilisateur : CREATE USER regisflow WITH PASSWORD 'RegisFlow2024!'; -# 2. Créer la base : CREATE DATABASE regisflow OWNER regisflow; -# 3. Donner les permissions : GRANT ALL PRIVILEGES ON DATABASE regisflow TO regisflow; +# - Port interne: 5432 (communication Docker) +# - Port externe: 5433 (accès depuis l'hôte) # Configuration de l'application NODE_ENV=production diff --git a/README_DOCKER.md b/README_DOCKER.md index 3408fad..b5da8dc 100644 --- a/README_DOCKER.md +++ b/README_DOCKER.md @@ -30,8 +30,8 @@ nano .env Éditez le fichier `.env` avec votre serveur PostgreSQL externe : ```env -# Configuration de la base de données EXTERNE (PRÉCONFIGURÉE) -DATABASE_URL=postgresql://regisflow:RegisFlow2024!@VOTRE_IP_POSTGRES:5433/regisflow +# Configuration PostgreSQL (PRÉCONFIGURÉE) +POSTGRES_PASSWORD=RegisFlow2024! # Configuration de l'application NODE_ENV=production @@ -100,18 +100,21 @@ docker-compose logs -f ## 📋 Services Inclus -### RegisFlow (Application) +### 1. PostgreSQL (Base de données) +- **Container**: regisflow-db +- **Port externe**: 5433 (accès depuis l'hôte) +- **Port interne**: 5432 (communication Docker) +- **Database**: regisflow +- **Utilisateur**: regisflow +- **Données persistantes**: Volume `postgres_data` + +### 2. RegisFlow (Application) +- **Container**: regisflow-app - **Port**: 5000 -- **Base de données**: PostgreSQL externe (configurée via DATABASE_URL) +- **Dépendances**: regisflow-db - **Sauvegardes**: Volume `backup_data` - **Health check**: `/health` - -### Configuration PostgreSQL Externe -- **Prérequis**: Serveur PostgreSQL accessible depuis Docker -- **Port**: 5433 (standard pour PostgreSQL externe) -- **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 +- **Connexion DB**: Via nom de container `regisflow-db:5432` diff --git a/attached_assets/image_1752095069705.png b/attached_assets/image_1752095069705.png new file mode 100644 index 0000000..36eb6f6 Binary files /dev/null and b/attached_assets/image_1752095069705.png differ diff --git a/attached_assets/image_1752095080097.png b/attached_assets/image_1752095080097.png new file mode 100644 index 0000000..36eb6f6 Binary files /dev/null and b/attached_assets/image_1752095080097.png differ diff --git a/docker-compose.yml b/docker-compose.yml index 03fc7a8..e7c3f9b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,37 @@ version: '3.8' services: - # Application RegisFlow seule (base de données externe) + # Base de données PostgreSQL + regisflow-db: + 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 regisflow: build: . container_name: regisflow-app + depends_on: + regisflow-db: + condition: service_healthy environment: NODE_ENV: production PORT: 5000 - DATABASE_URL: ${DATABASE_URL} + DATABASE_URL: postgresql://regisflow:${POSTGRES_PASSWORD:-RegisFlow2024!}@regisflow-db:5432/regisflow SESSION_SECRET: ${SESSION_SECRET:-your-super-secret-session-key-change-in-production} TZ: Europe/Paris volumes: @@ -24,5 +47,7 @@ services: 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 7e02486..0993a55 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -4,43 +4,27 @@ set -e # Script d'entrée pour le container RegisFlow echo "🚀 Démarrage de RegisFlow..." -# Attendre que la base de données externe soit prête -echo "📡 Attente de la base de données externe..." +# Attendre que la base de données Docker soit prête +echo "📡 Attente de la base de données regisflow-db..." +echo "🔍 Test de connexion à regisflow-db:5432..." -# 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 +# Attendre jusqu'à 120 secondes pour PostgreSQL Docker RETRIES=24 while [ $RETRIES -gt 0 ]; do - if pg_isready -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER"; then - echo "✅ PostgreSQL externe est prêt!" + if pg_isready -h regisflow-db -p 5432 -U regisflow; then + echo "✅ PostgreSQL regisflow-db est prêt!" break fi - echo "⏳ Base de données externe non prête, tentative $((25-RETRIES))/24, attente de 5 secondes..." + echo "⏳ Base de données 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 externe après 2 minutes" + echo "❌ Timeout: Impossible de se connecter à regisflow-db après 2 minutes" echo "🔍 Diagnostic:" - 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" + echo " - Vérifiez que le service regisflow-db démarre correctement" + echo " - Vérifiez les logs: docker-compose logs regisflow-db" exit 1 fi diff --git a/init.sql b/init.sql index c3cce53..16448c3 100644 --- a/init.sql +++ b/init.sql @@ -1,21 +1,10 @@ --- Script d'initialisation pour la base de données RegisFlow --- Ce script sera exécuté automatiquement lors de la création du container PostgreSQL +-- Script d'initialisation PostgreSQL pour RegisFlow +-- Exécuté automatiquement lors de la création du container --- Créer les extensions nécessaires -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +-- L'utilisateur et la base sont créés automatiquement via les variables d'environnement +-- POSTGRES_USER=regisflow +-- POSTGRES_DB=regisflow +-- POSTGRES_PASSWORD=RegisFlow2024! --- Créer la table des sessions (nécessaire pour express-session) -CREATE TABLE IF NOT EXISTS sessions ( - sid varchar NOT NULL COLLATE "default", - sess json NOT NULL, - expire timestamp(6) NOT NULL -); - --- Créer un index sur la colonne d'expiration -CREATE INDEX IF NOT EXISTS "IDX_session_expire" ON sessions ("expire"); - --- Créer la clé primaire pour la table des sessions -ALTER TABLE sessions ADD CONSTRAINT "session_pkey" PRIMARY KEY (sid) NOT DEFERRABLE INITIALLY IMMEDIATE; - --- Créer un utilisateur pour l'application (optionnel, déjà créé par les variables d'environnement) --- Les autres tables seront créées automatiquement par Drizzle lors du démarrage de l'application \ No newline at end of file +-- Configuration additionnelle si nécessaire +-- (Actuellement vide car Drizzle ORM gère la création des tables) \ No newline at end of file