services: # PostgreSQL - Primary Database # Limit: 256MB RAM. Sufficient for local dev schemas. # Port 15432 avoids conflict with other projects using default 5432 postgres: image: postgres:16-alpine container_name: veza_postgres restart: unless-stopped environment: POSTGRES_USER: veza POSTGRES_PASSWORD: password POSTGRES_DB: veza ports: - "${PORT_POSTGRES:-15432}:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U veza" ] interval: 5s timeout: 5s retries: 5 networks: - veza-net deploy: resources: limits: cpus: '0.50' memory: 256M reservations: memory: 128M # Redis - Cache & PubSub # Limit: 64MB RAM. Port 16379 avoids conflict with other projects (default 6379) redis: image: redis:7-alpine container_name: veza_redis restart: unless-stopped ports: - "${PORT_REDIS:-16379}:6379" volumes: - redis_data:/data healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s timeout: 3s retries: 5 networks: - veza-net deploy: resources: limits: cpus: '0.25' memory: 64M reservations: memory: 32M # RabbitMQ - Message Broker # Limit: 256MB RAM. Host 15672->AMQP(5672), 25672->Management(15672) rabbitmq: image: rabbitmq:3-management-alpine container_name: veza_rabbitmq restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: veza RABBITMQ_DEFAULT_PASS: password ports: - "${PORT_RABBITMQ_AMQP:-15672}:5672" # AMQP (messaging) - "${PORT_RABBITMQ_MGMT:-25672}:15672" # Management UI volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: rabbitmq-diagnostics -q ping interval: 5s timeout: 5s retries: 10 start_period: 40s networks: - veza-net deploy: resources: limits: cpus: '0.50' memory: 512M reservations: memory: 256M # Backend API (Docker dev) backend-api: build: context: ./veza-backend-api container_name: veza_backend_dev environment: - APP_ENV=development - DATABASE_URL=postgresql://veza:password@postgres:5432/veza?sslmode=disable - REDIS_URL=redis://redis:6379 - JWT_SECRET=dev-secret-key-minimum-32-characters-long - COOKIE_SECURE=false # false en dev local - COOKIE_SAME_SITE=lax - COOKIE_DOMAIN= - COOKIE_HTTP_ONLY=true - COOKIE_PATH=/ - CORS_ALLOWED_ORIGINS=http://veza.fr:3000,http://veza.fr:5173 - RABBITMQ_URL=amqp://veza:password@rabbitmq:5672/ ports: - "${PORT_BACKEND:-18080}:8080" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy networks: - veza-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/api/v1/health"] interval: 10s timeout: 5s retries: 5 volumes: postgres_data: redis_data: rabbitmq_data: networks: veza-net: driver: bridge