From a4c5301d7484ee4e4564500fc679ba079bb76e50 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Wed, 9 Jul 2025 21:05:48 +0000 Subject: [PATCH] Integrate internal database within Docker for simplified setup and deployment Configures PostgreSQL to run inside Docker, streamlining deployment and simplifying database management using Drizzle ORM. 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 | 24 ++++++++-------- README_DOCKER.md | 25 ++++++++-------- attached_assets/image_1752095069705.png | Bin 0 -> 2099 bytes attached_assets/image_1752095080097.png | Bin 0 -> 2099 bytes docker-compose.yml | 29 +++++++++++++++++-- docker-entrypoint.sh | 36 +++++++----------------- init.sql | 27 ++++++------------ 7 files changed, 70 insertions(+), 71 deletions(-) create mode 100644 attached_assets/image_1752095069705.png create mode 100644 attached_assets/image_1752095080097.png 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 0000000000000000000000000000000000000000..36eb6f6a6e23a9a1663f3bf4a75888ca16df9798 GIT binary patch literal 2099 zcmbuA`#Td18^`BRjhxa-2gmCnC2BI~4O@h24xwShlr&8%GjyObbIuZSY?>TW4v+H? zAz{KCau^;XYGau56Jqb)f8l+9_}<^|=eoYX-Pe8Hu?}|D(vl}60RVust&Qb1q5l%f z5V&7Bj{yyIg(gC{W{m)p_A1T^LEI0HgaZKOl!JdT`-CiU-^Psq0LXm#uS7cV?{5JB z2Rdyn;m)Bq7AHKfI?pL}tnfw18PfsnhcKhW=e_}2F14*p7a4noL~9>f47us<)f z5DA%jlO{L#-m#%xHvsE@GT>%KDCR9T_)UDzeyM}_f_V2$Hy6Vz9f{x%z=Av8tnbd71`Yirl~(>caIw_Yv`ITz z7Q5%sA^Qx@=Qyp;58M54slb7y39lobL{~p_+qWenMHn9Y^CHITi}=lh$E7i%kJ4SC zl_O5&chW67JtnxPXF8X9s+y8mM%E6phhutu4G_@YOO)ixD76|5ruXWo6_dvU876P! zxQ5&c_4%|61rl{0y5$R(BjDZ3c%6^Ea!x)Bw$vBMH92rzX4(X1NAQx1nQ8<_2K!`Z z>dlPG%J!SR(#=k^C#h-Wbz;h_qnEdR9}TUgEH3NsCwdl|5nO8`xK=FsvF5EGZTH#yxbqk)$*Kc$S`Z^ zy(k9REc8+rRfL*#P9`Zt8;AOeGpBisZ50_p&^&9cn36cPb$@+}13!&td4K51Gvw%W z*SMb>YKZmREFbi0=I*)w+3~ln0!=NhJm>|uz7@2pE0OcL2mDv~Wtd{0*G_78k$_}E zPOpWh{&thFY}hvq=H^6h%lglazv^k%N&WqA<2S1OH(I-T3G9^4=VCY;6(9cg)n>;a z#3NJ0`iu_MtsbvVI@WNAc3w0720LhVbO%$GASeMcSRYc%RJjmlAI0+@F?bc>Wv?XU2I-4|rBY)vOLN zqKbXSf@k%D*AAI2d`Ha|M9`m&7+Uiv6Oai?pRD-3%!I}y`>>;L*|fDkz=lCIQ%TeU z2aTx3NeAEyTCACZ>kN&ElHL;|rhh(1`?VyNX^sw0WjWC$soHsy^)~&Sl_Rs)B&Kd$Bv9cL z!|skH=zOJQkylwiEIf@`}oC`JX zZdsZ2FYZZ=_9H7)FM4VsohU{o8Sac1!n>*jj(?0#ZfQe0rC#DFU_P9k7=6|ivf5|e z8k7basOlE|t+$aQZWOr48sZbg4kzRv7`wHo;arUa>m&c#)3}bBi4`A9 zbM4vH!tq@OP|Ci%auI09fqpyt8TPey>UXqis`;da*O204fk9Wh`NVW~2l6qsTGHao z<4I=zPAj-{hD4WP&&KrhFqFu{iOj&1!40@Fj1yh1a%toCS9B#-iq*Py<)ZE>_TYY?boKHUbVXqDffT+CnqxK89*& z?<9Rf*Qz)yoXdSbRfk%Bg`m8<%8U#x%DF@5@!4TlJw~a;noyA6chD4%1%x zk{EY4)HZ>;ljDktFLX`H96hhwbl6YcMkf(noMP}JaS^dk7O%vl`G0KzAwEGbRLUdZ z@>kVB>O%ZKLf-KxHLsMT2;Ef`sYr*HQodw|m*P&qeYRk-L*G*oUm8HhOmG=1eDnZY MD?7_lgm=V$008y&H~;_u literal 0 HcmV?d00001 diff --git a/attached_assets/image_1752095080097.png b/attached_assets/image_1752095080097.png new file mode 100644 index 0000000000000000000000000000000000000000..36eb6f6a6e23a9a1663f3bf4a75888ca16df9798 GIT binary patch literal 2099 zcmbuA`#Td18^`BRjhxa-2gmCnC2BI~4O@h24xwShlr&8%GjyObbIuZSY?>TW4v+H? zAz{KCau^;XYGau56Jqb)f8l+9_}<^|=eoYX-Pe8Hu?}|D(vl}60RVust&Qb1q5l%f z5V&7Bj{yyIg(gC{W{m)p_A1T^LEI0HgaZKOl!JdT`-CiU-^Psq0LXm#uS7cV?{5JB z2Rdyn;m)Bq7AHKfI?pL}tnfw18PfsnhcKhW=e_}2F14*p7a4noL~9>f47us<)f z5DA%jlO{L#-m#%xHvsE@GT>%KDCR9T_)UDzeyM}_f_V2$Hy6Vz9f{x%z=Av8tnbd71`Yirl~(>caIw_Yv`ITz z7Q5%sA^Qx@=Qyp;58M54slb7y39lobL{~p_+qWenMHn9Y^CHITi}=lh$E7i%kJ4SC zl_O5&chW67JtnxPXF8X9s+y8mM%E6phhutu4G_@YOO)ixD76|5ruXWo6_dvU876P! zxQ5&c_4%|61rl{0y5$R(BjDZ3c%6^Ea!x)Bw$vBMH92rzX4(X1NAQx1nQ8<_2K!`Z z>dlPG%J!SR(#=k^C#h-Wbz;h_qnEdR9}TUgEH3NsCwdl|5nO8`xK=FsvF5EGZTH#yxbqk)$*Kc$S`Z^ zy(k9REc8+rRfL*#P9`Zt8;AOeGpBisZ50_p&^&9cn36cPb$@+}13!&td4K51Gvw%W z*SMb>YKZmREFbi0=I*)w+3~ln0!=NhJm>|uz7@2pE0OcL2mDv~Wtd{0*G_78k$_}E zPOpWh{&thFY}hvq=H^6h%lglazv^k%N&WqA<2S1OH(I-T3G9^4=VCY;6(9cg)n>;a z#3NJ0`iu_MtsbvVI@WNAc3w0720LhVbO%$GASeMcSRYc%RJjmlAI0+@F?bc>Wv?XU2I-4|rBY)vOLN zqKbXSf@k%D*AAI2d`Ha|M9`m&7+Uiv6Oai?pRD-3%!I}y`>>;L*|fDkz=lCIQ%TeU z2aTx3NeAEyTCACZ>kN&ElHL;|rhh(1`?VyNX^sw0WjWC$soHsy^)~&Sl_Rs)B&Kd$Bv9cL z!|skH=zOJQkylwiEIf@`}oC`JX zZdsZ2FYZZ=_9H7)FM4VsohU{o8Sac1!n>*jj(?0#ZfQe0rC#DFU_P9k7=6|ivf5|e z8k7basOlE|t+$aQZWOr48sZbg4kzRv7`wHo;arUa>m&c#)3}bBi4`A9 zbM4vH!tq@OP|Ci%auI09fqpyt8TPey>UXqis`;da*O204fk9Wh`NVW~2l6qsTGHao z<4I=zPAj-{hD4WP&&KrhFqFu{iOj&1!40@Fj1yh1a%toCS9B#-iq*Py<)ZE>_TYY?boKHUbVXqDffT+CnqxK89*& z?<9Rf*Qz)yoXdSbRfk%Bg`m8<%8U#x%DF@5@!4TlJw~a;noyA6chD4%1%x zk{EY4)HZ>;ljDktFLX`H96hhwbl6YcMkf(noMP}JaS^dk7O%vl`G0KzAwEGbRLUdZ z@>kVB>O%ZKLf-KxHLsMT2;Ef`sYr*HQodw|m*P&qeYRk-L*G*oUm8HhOmG=1eDnZY MD?7_lgm=V$008y&H~;_u literal 0 HcmV?d00001 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