services: frontend: build: context: ./frontend dockerfile: Dockerfile container_name: vertical-frontend restart: always ports: - "80:80" depends_on: backend: condition: service_healthy # Prevent frontend from hogging memory (unlikely but safe) mem_limit: 512m backend: build: context: ./backend dockerfile: Dockerfile container_name: vertical-backend restart: always ports: - "8000:8000" env_file: - .env environment: - NEO4J_URI=bolt://neo4j:7687 - NEO4J_USER=${NEO4J_USER:-neo4j} - NEO4J_PASSWORD=${NEO4J_PASSWORD:-password} # Tell backend where other services are - REDIS_HOST=redis depends_on: neo4j: condition: service_healthy redis: condition: service_healthy volumes: - ./uploads:/app/uploads - ./backend/static:/app/static # CRITICAL: Limit memory to prevent system crash # If app needs more, it will crash container, not Windows mem_limit: 2g cpus: 1.5 neo4j: image: neo4j:latest container_name: vertical-neo4j restart: always ports: - "7474:7474" # HTTP - "7687:7687" # Bolt environment: - NEO4J_AUTH=${NEO4J_USER:-neo4j}/${NEO4J_PASSWORD:-password} volumes: - ./neo4j/data:/data - ./neo4j/logs:/logs mem_limit: 1g healthcheck: test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1" ] interval: 10s timeout: 5s retries: 5 redis: image: redis:alpine container_name: vertical-redis restart: always ports: - "6379:6379" mem_limit: 256m healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 10s timeout: 5s retries: 5