version: '3.8' services: # PostgreSQL - Primary Database # Limit: 256MB RAM. Sufficient for local dev schemas. postgres: image: postgres:16-alpine container_name: veza_postgres restart: unless-stopped environment: POSTGRES_USER: veza POSTGRES_PASSWORD: password POSTGRES_DB: veza ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U veza"] interval: 5s timeout: 5s retries: 5 deploy: resources: limits: cpus: '0.50' memory: 256M reservations: memory: 128M # Redis - Cache & PubSub # Limit: 64MB RAM. redis: image: redis:7-alpine container_name: veza_redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 deploy: resources: limits: cpus: '0.25' memory: 64M reservations: memory: 32M # RabbitMQ - Message Broker # Limit: 256MB RAM. Uses Erlang, can be memory hungry. Alpine helps. rabbitmq: image: rabbitmq:3-management-alpine container_name: veza_rabbitmq restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: veza RABBITMQ_DEFAULT_PASS: password ports: - "5672:5672" # AMQP - "15672:15672" # Management UI volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: rabbitmq-diagnostics -q ping interval: 10s timeout: 10s retries: 5 deploy: resources: limits: cpus: '0.50' memory: 256M reservations: memory: 128M volumes: postgres_data: redis_data: rabbitmq_data: