From a6d741fc5362060dd24a6dcc4db37766947a2ba4 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Sun, 13 Jul 2025 12:23:55 +0000 Subject: [PATCH] Improve deployment setup by adding network configurations and production files Adds Docker network configuration, production compose file, and documentation updates in replit.md. Replit-Commit-Author: Agent Replit-Commit-Session-Id: dec54137-d5a2-4406-8ad4-5f2f9fb110bf Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/5d315300-98fa-429a-abb0-4fdce6a2e3c9.jpg --- attached_assets/image_1752409247823.png | Bin 0 -> 36910 bytes docker-compose.prod.yml | 74 ++++++++++++++++++++++++ docker-compose.yml | 12 ++-- replit.md | 8 +++ 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 attached_assets/image_1752409247823.png create mode 100644 docker-compose.prod.yml diff --git a/attached_assets/image_1752409247823.png b/attached_assets/image_1752409247823.png new file mode 100644 index 0000000000000000000000000000000000000000..8bbbb0a43022befdfce30bd9acf80fd8276f0fe3 GIT binary patch literal 36910 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

()xh=60!6Cad9)cMkIH4ZW65R+g-X)Oe|> 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 WwQ^!jb)~%X31iL2B#xf5;eP-J!Mn!* literal 0 HcmV?d00001 diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..c60b99f --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,74 @@ +version: '3.8' + +# Configuration Docker Compose pour production avec réseau externe +services: + # 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!PostgreSQL} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5433:5432" + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U regisflow -d regisflow || exit 1"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 40s + + # Application RegisFlow + regisflow: + build: + context: . + dockerfile: Dockerfile + target: production + args: + - NODE_ENV=production + container_name: regisflow-app + depends_on: + regisflow-db: + condition: service_healthy + pull_policy: never + environment: + NODE_ENV: production + PORT: 3000 + DATABASE_URL: postgresql://regisflow:${POSTGRES_PASSWORD:-RegisFlow2024!PostgreSQL}@regisflow-db:5432/regisflow + SESSION_SECRET: ${SESSION_SECRET:-RegisFlow2024SessionSecretKey1234567890ABCDEF} + TZ: ${TZ:-Europe/Paris} + SECURE_COOKIES: ${SECURE_COOKIES:-false} + DATA_RETENTION_MONTHS: ${DATA_RETENTION_MONTHS:-19} + BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-90} + MAX_BACKUP_COUNT: ${MAX_BACKUP_COUNT:-20} + volumes: + - backup_data:/app/backups + - logs_data:/app/logs + ports: + - "3000:3000" + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 120s + +# Volumes persistants +volumes: + postgres_data: + driver: local + backup_data: + driver: local + logs_data: + driver: local + +# Utilisation du réseau nginx_default pour production Replit +networks: + default: + external: true + name: nginx_default \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index b6bbade..995e605 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,8 @@ services: regisflow-db: image: postgres:15-alpine container_name: regisflow-db + networks: + - regisflow_network environment: POSTGRES_DB: regisflow POSTGRES_USER: regisflow @@ -32,6 +34,8 @@ services: args: - NODE_ENV=production container_name: regisflow-app + networks: + - regisflow_network depends_on: regisflow-db: condition: service_healthy @@ -68,8 +72,8 @@ volumes: logs_data: driver: local -# Utilisation du réseau nginx_default existant +# Configuration réseau flexible pour déploiement networks: - default: - external: true - name: nginx_default \ No newline at end of file + regisflow_network: + driver: bridge + name: regisflow_network \ No newline at end of file diff --git a/replit.md b/replit.md index 1d92b0d..8cc4cc5 100644 --- a/replit.md +++ b/replit.md @@ -359,6 +359,14 @@ Preferred communication style: Simple, everyday language. - ✅ Corrected port configuration from 5000 to 3000 for proper deployment - ✅ Updated all Docker and application configurations to use port 3000 +### Docker Network Connectivity Fix (January 13, 2025) +- ✅ Fixed "driver failed programming external connectivity" deployment error +- ✅ Created flexible network configuration with local bridge network +- ✅ Added docker-compose.prod.yml for production deployment with nginx_default +- ✅ Separated development and production Docker configurations +- ✅ Resolved external network dependency issues preventing deployment +- ✅ Enhanced network specifications for both database and application services + ### Portainer Deployment Fix (January 10, 2025) - ✅ Resolved Docker image pull error "regisflow-regisflow:latest" in Portainer - ✅ Created local image building solution with "regisflow:latest" tag