Sign inSign up

gfvfullstack/agents-mvp:stack-0.1.0

Manifest digest

sha256:9bf8905164bd00de1b7b279095249ff1eedc90925a788988db7b1e3a3236dea3

Last pushed

1 day by pomaredam

Type

Compose

Manifest digest

sha256:9bf8905164bd00de1b7b279095249ff1eedc90925a788988db7b1e3a3236dea3

Compose file content

# ---------------------------------------------------------------------------
# Build y deploy del MVP con las imagenes de Docker Hub. Todas viven en un solo
# repo, `gfvfullstack/agents-mvp`, con un tag por componente: `db-<TAG>`,
# `mongo-<TAG>`, `mongo-init-<TAG>`, `mcp-<TAG>`, `service-<TAG>` y
# `webapp-<TAG>`, mas `<x>-latest`. Este mismo archivo va publicado como
# `stack-<TAG>`.
#
# BUILD (en la maquina que tiene los cuatro repos al lado de `deploy/`, en la
# rama que se quiere publicar):
#
#   docker compose build              # tags <x>-${TAG} y <x>-latest
#   docker compose push               # sube todo a gfvfullstack/agents-mvp
#   docker compose publish --resolve-image-digests gfvfullstack/agents-mvp:stack-0.1.0
#
# `mongo-<TAG>` es una copia fija de `mongodb/mongodb-atlas-local`, re-tageada a
# mano: asi el deploy no depende de que `latest` cambie. `mongo-init-<TAG>` la
# extiende con los scripts de `mongo/`, que son copia de
# `database/mongo/init.js` y `database/seed/mongo/002_vectores_demo.js`.
#
# DEPLOY: no hacen falta los repos ni esta carpeta, solo un `.env` armado desde
# `.env.example`. Nunca se publica con `--with-env`: el `.env` lleva secretos.
#
#   docker login                      # cuenta con acceso a gfvfullstack
#   docker compose -f oci://docker.io/gfvfullstack/agents-mvp:stack-0.1.0 --env-file .env up -d
#   docker compose -f oci://docker.io/gfvfullstack/agents-mvp:stack-0.1.0 --env-file .env down
#
# Con esta carpeta a mano tambien sirve el camino local:
#
#   docker compose up -d --no-build   # nunca intenta buildear sin los repos
#   docker compose logs -f
#   docker compose down               # apaga, CONSERVA los datos
#   docker compose down -v            # borra los volumenes: reinicializa todo
#
# Solo `agents-webapp` se publica hacia afuera. `agents-mcp` y `agents-service`
# no autentican a nadie --el `agent_id` llega en el body-- y se publican solo en
# 127.0.0.1, para probarlos a mano desde la misma maquina.
# ---------------------------------------------------------------------------

name: agents-demo

x-logging: &logging
  driver: json-file
  options:
    max-size: '10m'
    max-file: '3'

services:

  # -------------------------------------------------------------------------
  # agents-db: SQL Server con `AgentKnowlage` y `rrhh_ferrum_bot`. Los DDL y
  # los seeds de demostracion vienen horneados en la imagen; el primer arranque
  # crea las dos bases y el login de aplicacion.
  # -------------------------------------------------------------------------
  agents-db:
    image: gfvfullstack/agents-mvp:db-${TAG:-0.1.0}
    build:
      context: ../database
      platforms: [linux/amd64]
      tags: [gfvfullstack/agents-mvp:db-latest]
    restart: unless-stopped
    environment:
      MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD:?falta MSSQL_SA_PASSWORD en .env}
      AGENTS_DB_USERNAME: ${AGENTS_DB_USERNAME:?falta AGENTS_DB_USERNAME en .env}
      AGENTS_DB_PASSWORD: ${AGENTS_DB_PASSWORD:?falta AGENTS_DB_PASSWORD en .env}
    volumes:
      - agents-db-data:/var/opt/mssql
    healthcheck:
      # El testigo es `rrhh_ferrum_bot`, la segunda base que crea el
      # entrypoint: si responde, estan las dos.
      test:
        - CMD-SHELL
        - /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$$MSSQL_SA_PASSWORD" -d rrhh_ferrum_bot -Q "SELECT 1" -b -o /dev/null
      interval: 10s
      timeout: 10s
      retries: 30
      start_period: 180s
    logging: *logging

  # -------------------------------------------------------------------------
  # agents-mongo: Atlas local (mongod + mongot) para el Vector Search.
  # -------------------------------------------------------------------------
  agents-mongo:
    image: gfvfullstack/agents-mvp:mongo-${TAG:-0.1.0}
    hostname: agents-mongo
    restart: unless-stopped
    environment:
      MONGODB_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USERNAME:?falta MONGO_ROOT_USERNAME en .env}
      MONGODB_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD:?falta MONGO_ROOT_PASSWORD en .env}
    volumes:
      - agents-mongo-data:/data/db
      - agents-mongo-config:/data/configdb
      - agents-mongot-data:/data/mongot
    logging: *logging

  # Crea la coleccion y el indice, carga los vectores de demo y sale. Los dos
  # scripts son idempotentes: corren en cada `up` sin romper nada.
  #
  # Los scripts van horneados en la imagen (`mongo/Dockerfile`) y no montados:
  # el compose publicado como `stack-<TAG>` no puede llevar archivos locales.
  agents-mongo-init:
    image: gfvfullstack/agents-mvp:mongo-init-${TAG:-0.1.0}
    build:
      context: ./mongo
      platforms: [linux/amd64]
      args:
        BASE_IMAGE: gfvfullstack/agents-mvp:mongo-${TAG:-0.1.0}
      tags: [gfvfullstack/agents-mvp:mongo-init-latest]
    depends_on:
      agents-mongo:
        condition: service_healthy
    environment:
      MONGO_URI: mongodb://${MONGO_ROOT_USERNAME}:${MONGO_ROOT_PASSWORD}@agents-mongo:27017/?directConnection=true
    entrypoint:
      - sh
      - -c
      - 'mongosh "$$MONGO_URI" --quiet --file /init/init.js && mongosh "$$MONGO_URI" --quiet --file /init/seed.js'
    restart: 'no'

  # -------------------------------------------------------------------------
  # agents-mcp: el conocimiento. Lee `AgentKnowlage` y busca en MongoDB.
  # -------------------------------------------------------------------------
  agents-mcp:
    image: gfvfullstack/agents-mvp:mcp-${TAG:-0.1.0}
    build:
      context: ../agents-mcp
      platforms: [linux/amd64]
      tags: [gfvfullstack/agents-mvp:mcp-latest]
    restart: unless-stopped
    environment:
      AZURE_AI_ENDPOINT: ${AZURE_AI_ENDPOINT:?falta AZURE_AI_ENDPOINT en .env}
      AZURE_AI_API_KEY: ${AZURE_AI_API_KEY:?falta AZURE_AI_API_KEY en .env}
      EMBEDDINGS_PATH: /openai/v1/embeddings
      EMBEDDINGS_MODEL: ${EMBEDDINGS_DEPLOYMENT:?falta EMBEDDINGS_DEPLOYMENT en .env}
      RERANK_ENDPOINT: ${RERANK_ENDPOINT:-}
      RERANK_API_KEY: ${RERANK_API_KEY:-}
      SQL_SERVER: agents-db
      SQL_PORT: '1433'
      SQL_DATABASE: AgentKnowlage
      SQL_USER: ${AGENTS_DB_USERNAME}
      SQL_PASSWORD: ${AGENTS_DB_PASSWORD}
      SQL_DRIVER: ODBC Driver 18 for SQL Server
      SQL_ENCRYPT: 'true'
      SQL_TRUST_CERTIFICATE: 'true'
      MCP_TRANSPORT: streamable-http
      MCP_HOST: 0.0.0.0
      MCP_PORT: '8000'
      MONGODB_URI: mongodb://${MONGO_ROOT_USERNAME}:${MONGO_ROOT_PASSWORD}@agents-mongo:27017/?directConnection=true
      MONGODB_DB: agentknowledge
      LOG_LEVEL: ${LOG_LEVEL:-INFO}
    ports:
      # Solo en 127.0.0.1: para probarlo a mano desde la maquina donde corre.
      # No autentica a nadie, asi que nunca en 0.0.0.0.
      - target: 8000
        host_ip: 127.0.0.1
        published: '${MCP_HOST_PORT:-8000}'
    depends_on:
      agents-db:
        condition: service_healthy
      agents-mongo:
        condition: service_healthy
      agents-mongo-init:
        condition: service_completed_successfully
    healthcheck:
      test:
        - CMD-SHELL
        - python -c "import socket; socket.create_connection(('127.0.0.1', 8000), 2).close()"
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s
    logging: *logging

  # -------------------------------------------------------------------------
  # agents-service: el orquestador. Habla con Foundry y guarda conversaciones.
  # -------------------------------------------------------------------------
  agents-service:
    image: gfvfullstack/agents-mvp:service-${TAG:-0.1.0}
    build:
      context: ../agents-service
      platforms: [linux/amd64]
      tags: [gfvfullstack/agents-mvp:service-latest]
    restart: unless-stopped
    environment:
      AZURE_AI_ENDPOINT: ${AZURE_AI_ENDPOINT}
      AZURE_AI_API_KEY: ${AZURE_AI_API_KEY}
      CHAT_MODEL: ${CHAT_DEPLOYMENT:?falta CHAT_DEPLOYMENT en .env}
      CHAT_PATH: /openai/v1/chat/completions
      MCP_TRANSPORT: streamable-http
      MCP_URL: http://agents-mcp:8000/mcp
      CONVERSACIONES_SQL_SERVER: agents-db
      CONVERSACIONES_SQL_PORT: '1433'
      CONVERSACIONES_SQL_DATABASE: AgentKnowlage
      CONVERSACIONES_SQL_USER: ${AGENTS_DB_USERNAME}
      CONVERSACIONES_SQL_PASSWORD: ${AGENTS_DB_PASSWORD}
      CONVERSACIONES_SQL_DRIVER: ODBC Driver 18 for SQL Server
      CONVERSACIONES_SQL_ENCRYPT: '1'
      CONVERSACIONES_SQL_TRUST_CERTIFICATE: '1'
      RRHH_SQL_SERVER: agents-db
      RRHH_SQL_PORT: '1433'
      RRHH_SQL_DATABASE: rrhh_ferrum_bot
      RRHH_SQL_USER: ${AGENTS_DB_USERNAME}
      RRHH_SQL_PASSWORD: ${AGENTS_DB_PASSWORD}
      RRHH_SQL_DRIVER: ODBC Driver 18 for SQL Server
      RRHH_SQL_ENCRYPT: '1'
      RRHH_SQL_TRUST_CERTIFICATE: '1'
      LOG_LEVEL: ${LOG_LEVEL:-INFO}
    ports:
      # Solo en 127.0.0.1, por lo mismo que el MCP.
      - target: 8100
        host_ip: 127.0.0.1
        published: '${SERVICE_HOST_PORT:-8100}'
    depends_on:
      agents-db:
        condition: service_healthy
      agents-mcp:
        condition: service_healthy
    healthcheck:
      test:
        - CMD-SHELL
        - python -c "import socket; socket.create_connection(('127.0.0.1', 8100), 2).close()"
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s
    logging: *logging

  # -------------------------------------------------------------------------
  # agents-webapp: la pantalla. El unico servicio con puerto hacia afuera.
  # -------------------------------------------------------------------------
  agents-webapp:
    image: gfvfullstack/agents-mvp:webapp-${TAG:-0.1.0}
    build:
      context: ../agents-webapp
      platforms: [linux/amd64]
      tags: [gfvfullstack/agents-mvp:webapp-latest]
    restart: unless-stopped
    environment:
      EMBEDDINGS_URL: ${AZURE_AI_ENDPOINT}/openai/v1/embeddings
      EMBEDDINGS_DEPLOYMENT: ${EMBEDDINGS_DEPLOYMENT}
      EMBEDDINGS_API_KEY: ${AZURE_AI_API_KEY}
      # Las dos llamadas salen del servidor de Next, nunca del navegador: los
      # nombres de la red de Docker resuelven.
      MCP_URL: http://agents-mcp:8000/mcp
      AGENTS_SERVICE_URL: http://agents-service:8100/chat
      SQL_SERVER: agents-db
      SQL_PORT: '1433'
      SQL_DATABASE: AgentKnowlage
      SQL_USER: ${AGENTS_DB_USERNAME}
      SQL_PASSWORD: ${AGENTS_DB_PASSWORD}
      MONGODB_URI: mongodb://${MONGO_ROOT_USERNAME}:${MONGO_ROOT_PASSWORD}@agents-mongo:27017/?directConnection=true
      MONGODB_DB: agentknowledge
      RRHH_SQL_SERVER: agents-db
      RRHH_SQL_PORT: '1433'
      RRHH_SQL_DATABASE: rrhh_ferrum_bot
      RRHH_SQL_USER: ${AGENTS_DB_USERNAME}
      RRHH_SQL_PASSWORD: ${AGENTS_DB_PASSWORD}
    ports:
      # En todas las interfaces, para que el equipo llegue a la demo. Con
      # WEBAPP_BIND=127.0.0.1 queda solo local, detras de un reverse proxy.
      - target: 3000
        host_ip: '${WEBAPP_BIND:-0.0.0.0}'
        published: '${WEBAPP_PORT:-3000}'
    depends_on:
      agents-db:
        condition: service_healthy
      agents-mongo:
        condition: service_healthy
      agents-service:
        condition: service_healthy
    logging: *logging

volumes:
  agents-db-data:
  agents-mongo-data:
  agents-mongo-config:
  agents-mongot-data:
services:
  agents-db:
    image: docker.io/gfvfullstack/agents-mvp:db-0.1.0@sha256:855be75ddf044893e8388bc034bd63fe5c95c6af8bacbd36881fe9542402498f
  agents-mcp:
    image: docker.io/gfvfullstack/agents-mvp:mcp-0.1.0@sha256:089e683f6a85a7c343c0e234aeb1725421689ea85acaf8ea9863714157b99d84
  agents-mongo:
    image: docker.io/gfvfullstack/agents-mvp:mongo-0.1.0@sha256:fa0132afe1219bc0461e474e479e9c760a344f5f429d7a7c6ae89de113b4170f
  agents-mongo-init:
    image: docker.io/gfvfullstack/agents-mvp:mongo-init-0.1.0@sha256:abf067901dee6b302f462991eb99e619214f8f07e25e31f78ab07dc0df173615
  agents-service:
    image: docker.io/gfvfullstack/agents-mvp:service-0.1.0@sha256:945a8a54ff4cb12bb9c9a29e47dc9da34a4243f87c2bb69eed9e3a05d6e0d2b7
  agents-webapp:
    image: docker.io/gfvfullstack/agents-mvp:webapp-0.1.0@sha256:1ea9062b0f2672f9012ce54cb3fff0dc54ed9d576bd83fa0fb7dac3c936bf3a8

Docker commands

docker compose -f oci://gfvfullstack/agents-mvp:stack-0.1.0 up

Use the above command to pull and run the Compose file. Learn more⁠.

Images used

Compose + 1 more


Pulls

193

Stars

0

Last Updated

1 day