services:
    reverse-proxy:
        image: traefik:v2.10
        container_name: agenta-reverse_proxy-test
        command: --api.dashboard=true --api.insecure=true --providers.docker --entrypoints.web.address=:80
        ports:
            - "80:80"
            - "8080:8080"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        networks:
            - agenta-network

    backend:
        build: ./agenta-backend
        container_name: agenta-backend-test
        environment:
            - POSTGRES_URI=postgresql+asyncpg://username:password@postgres:5432/postgres
            - REDIS_URL=redis://redis:6379/0
            - ENVIRONMENT=${ENVIRONMENT}
            - BARE_DOMAIN_NAME=localhost
            - DOMAIN_NAME=http://localhost
            - CELERY_BROKER_URL=amqp://guest@rabbitmq//
            - CELERY_RESULT_BACKEND=redis://redis:6379/0
            - FEATURE_FLAG=oss
            - OPENAI_API_KEY=${OPENAI_API_KEY}
            - ALEMBIC_CFG_PATH=/app/agenta_backend/migrations/postgres/alembic.oss.ini
            - AGENTA_TEMPLATE_REPO=agentaai/templates_v2
            - REGISTRY_REPO_NAME=agentaai
            - DOCKER_HUB_URL=https://hub.docker.com/v2/repositories
        volumes:
            - ./agenta-backend/agenta_backend:/app/agenta_backend
            - ./agenta-backend/migrations:/app/migrations
            - ./agenta-backend/tests:/app/tests
            - /var/run/docker.sock:/var/run/docker.sock
        command:
            [
                "uvicorn",
                "agenta_backend.main:app",
                "--host",
                "0.0.0.0",
                "--port",
                "8000",
                "--reload",
                "--log-level",
                "info",
                "--root-path",
                "/api",
            ]
        labels:
            - "traefik.http.routers.backend.rule=PathPrefix(`/api/`)"
            - "traefik.http.routers.backend.entrypoints=web"
            - "traefik.http.middlewares.backend-strip.stripprefix.prefixes=/api"
            - "traefik.http.middlewares.backend-strip.stripprefix.forceslash=true"
            - "traefik.http.routers.backend.middlewares=backend-strip"
            - "traefik.http.services.backend.loadbalancer.server.port=8000"
            - "traefik.http.routers.backend.service=backend"
        depends_on:
            postgres:
                condition: service_healthy
            apply_alembic_migration:
                condition: service_completed_successfully
        extra_hosts:
            - host.docker.internal:host-gateway
        networks:
            - agenta-network

    apply_alembic_migration:
        build: ./agenta-backend
        command: sh -c "python -c 'from agenta_backend.migrations.postgres.utils import run_alembic_migration; run_alembic_migration()'"
        environment:
            - FEATURE_FLAG=oss
            - POSTGRES_URI=postgresql+asyncpg://username:password@postgres:5432/postgres
            - ALEMBIC_CFG_PATH=/app/agenta_backend/migrations/postgres/alembic.oss.ini
            - AGENTA_AUTO_MIGRATIONS=true
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./agenta-backend/agenta_backend:/app/agenta_backend
        depends_on:
            postgres:
                condition: service_healthy
        networks:
            - agenta-network

    agenta-web:
        build:
            context: ./agenta-web
            dockerfile: dev.Dockerfile
        volumes:
            - ./agenta-web/src:/app/src
            - ./agenta-web/public:/app/public
            - .nextjs_cache:/app/.next
        ports:
            - "3000:3000"
        networks:
            - agenta-network
        labels:
            - "traefik.http.routers.agenta-web.rule=PathPrefix(`/`)"
            - "traefik.http.routers.agenta-web.entrypoints=web"
            - "traefik.http.services.agenta-web.loadbalancer.server.port=3000"
        restart: always

    redis:
        image: redis:latest
        container_name: agenta-redis-test
        networks:
            - agenta-network
        volumes:
            - redis_data:/data

    rabbitmq:
        image: rabbitmq:3-management
        container_name: agenta-rabbitmq-test
        ports:
            - "5672:5672"
            - "15672:15672"
        volumes:
            - ./rabbitmq_data:/var/lib/rabbitmq
        environment:
            RABBITMQ_DEFAULT_USER: "guest"
            RABBITMQ_DEFAULT_PASS: "guest"
        networks:
            - agenta-network

    celery_worker:
        build: ./agenta-backend
        container_name: agenta-celery_worker-test
        command: >
            watchmedo auto-restart --directory=./agenta_backend --pattern=*.py --recursive -- celery -A agenta_backend.main.celery_app worker --concurrency=1 --loglevel=INFO
        environment:
            - POSTGRES_URI=postgresql+asyncpg://username:password@postgres:5432/postgres
            - REDIS_URL=redis://redis:6379/0
            - ALEMBIC_CFG_PATH=/app/agenta_backend/migrations/postgres/alembic.oss.ini
            - ENVIRONMENT=${ENVIRONMENT}
            - CELERY_BROKER_URL=amqp://guest@rabbitmq//
            - CELERY_RESULT_BACKEND=redis://redis:6379/0
            - FEATURE_FLAG=oss
        volumes:
            - ./agenta-backend/agenta_backend:/app/agenta_backend
            - /var/run/docker.sock:/var/run/docker.sock
        depends_on:
            - rabbitmq
            - redis
            - postgres
        extra_hosts:
            - host.docker.internal:host-gateway
        networks:
            - agenta-network

    postgres:
        image: postgres:16.2
        container_name: agenta-postgresdb-test
        restart: always
        environment:
            POSTGRES_USER: username
            POSTGRES_PASSWORD: password
        ports:
            - "5432:5432"
        networks:
            - agenta-network
        volumes:
            - postgresdb-data:/var/lib/postgresql/data/
        healthcheck:
            test: ["CMD-SHELL", "pg_isready -U username -d postgres"]
            interval: 10s
            timeout: 5s
            retries: 5

networks:
    agenta-network:
        name: agenta-network

volumes:
    postgresdb-data:
    redis_data:
