version: "3.8"

# Full Art DAG stack for Docker Swarm deployment
# Deploy with: docker stack deploy -c docker-stack.yml artdag

services:
  # Redis for L1
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    networks:
      - artdag
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: on-failure

  # L1 Server (API)
  l1-server:
    image: git.rose-ash.com/art-dag/l1-server:latest
    ports:
      - "8100:8100"
    env_file:
      - .env
    environment:
      - REDIS_URL=redis://redis:6379/5
      - CACHE_DIR=/data/cache
      # L1_PUBLIC_URL, L2_SERVER, L2_DOMAIN from .env file
    volumes:
      - l1_cache:/data/cache
    depends_on:
      - redis
    networks:
      - artdag
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure

  # L1 Worker (Celery)
  l1-worker:
    image: git.rose-ash.com/art-dag/l1-server:latest
    command: celery -A celery_app worker --loglevel=info
    environment:
      - REDIS_URL=redis://redis:6379/5
      - CACHE_DIR=/data/cache
      - C_FORCE_ROOT=true
    volumes:
      - l1_cache:/data/cache
    depends_on:
      - redis
    networks:
      - artdag
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure

  # L2 Server (ActivityPub)
  l2-server:
    image: git.rose-ash.com/art-dag/l2-server:latest
    ports:
      - "8200:8200"
    env_file:
      - .env
    environment:
      - ARTDAG_DATA=/data/l2
      # ARTDAG_DOMAIN, JWT_SECRET from .env file (multi-actor, no ARTDAG_USER)
    volumes:
      - l2_data:/data/l2
    depends_on:
      - l1-server
    networks:
      - artdag
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure

volumes:
  redis_data:
  l1_cache:
  l2_data:

networks:
  artdag:
    driver: overlay
