name: agentforms

services:
  relay:
    build: .
    container_name: agentforms-app
    user: "1000:1000"
    ports:
      - "5060:5060"
    volumes:
      - ./data:/app/data
      - ./app:/app/app
      - ./tests:/app/tests
      - ./alembic.ini:/app/alembic.ini:ro
      - ./alembic:/app/alembic:rw
    tmpfs:
      - /app/app/__pycache__:nosuid,noexec,nodev
    env_file:
      - ./data/.env
    environment:
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      redis:
        condition: service_healthy
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: "2.0"
          memory: "1G"
        reservations:
          cpus: "0.5"
          memory: "256M"
    healthcheck:
      test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5060/health/ready', timeout=5)"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 15s
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  worker:
    build: .
    container_name: agentforms-worker
    user: "1000:1000"
    command: python3 -m app.worker
    volumes:
      - ./data:/app/data
      - ./app:/app/app
      - ./tests:/app/tests
    tmpfs:
      - /app/app/__pycache__:nosuid,noexec,nodev
    env_file:
      - ./data/.env
    environment:
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      redis:
        condition: service_healthy
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: "512M"
        reservations:
          cpus: "0.25"
          memory: "128M"
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    healthcheck:
      test: ["CMD", "python3", "-c", "import redis, os, time; r=redis.from_url(os.environ.get('REDIS_URL','redis://localhost:6379/0')); hb=r.get('agentforms:worker:heartbeat'); assert hb is not None and (time.time()-float(hb))<180, 'worker heartbeat stale'"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 20s

  redis:
    image: redis:7-alpine
    container_name: agentforms-redis
    volumes:
      - redis-data:/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    logging:
      driver: json-file
      options:
        max-size: "1m"
        max-file: "2"

volumes:
  redis-data: