sha256:9bf8905164bd00de1b7b279095249ff1eedc90925a788988db7b1e3a3236dea3
Last pushed
1 day by pomaredam
Type
Compose
Manifest digest
sha256:9bf8905164bd00de1b7b279095249ff1eedc90925a788988db7b1e3a3236dea3
# ---------------------------------------------------------------------------
# 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 compose -f oci://gfvfullstack/agents-mvp:stack-0.1.0 upUse the above command to pull and run the Compose file. Learn more.