diff --git a/Dockerfile b/Dockerfile index cc5b727..1c82c8b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,6 @@ COPY typings ./typings RUN uv sync --frozen --no-dev RUN mkdir -p /app/data -EXPOSE 8000 +EXPOSE 8000 8001 CMD [".venv/bin/uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/README.md b/README.md index 6590ffd..b8d3600 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,15 @@ uv run uvicorn app.main:app --reload ### Docker ```bash -docker compose up --build -d -docker compose logs -f +docker compose up --build -d personal-agent personal-agent-mcp +docker compose logs -f personal-agent personal-agent-mcp ``` +Docker endpoints: + +- REST + A2A API: `http://127.0.0.1:8000` +- MCP streamable HTTP: `http://127.0.0.1:8001/mcp` + Container mounts: - `./${GOOGLE_CLIENT_SECRETS_FILE}` -> `/app/${GOOGLE_CLIENT_SECRETS_FILE}` (read-only) @@ -137,6 +142,8 @@ Run MCP on a dedicated port: uv run uvicorn app.mcp_main:app --host 0.0.0.0 --port 8001 ``` +With Docker Compose, MCP is provided by the `personal-agent-mcp` service. + MCP streamable HTTP endpoint: ```text diff --git a/docker-compose.yml b/docker-compose.yml index fb78df7..3be18e5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,7 @@ services: restart: unless-stopped env_file: - .env + command: [".venv/bin/uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] ports: - "8000:8000" volumes: @@ -18,3 +19,24 @@ services: interval: 30s timeout: 5s retries: 3 + + personal-agent-mcp: + build: + context: . + dockerfile: Dockerfile + container_name: personal-agent-mcp + restart: unless-stopped + env_file: + - .env + command: [".venv/bin/uvicorn", "app.mcp_main:app", "--host", "0.0.0.0", "--port", "8001"] + ports: + - "8001:8001" + volumes: + - ./${GOOGLE_CLIENT_SECRETS_FILE:-credentials.json}:/app/${GOOGLE_CLIENT_SECRETS_FILE:-credentials.json}:ro + - ./${GOOGLE_TOKEN_FILE:-token.json}:/app/${GOOGLE_TOKEN_FILE:-token.json} + - ./data:/app/data + healthcheck: + test: ["CMD", "python", "-c", "import socket;s=socket.create_connection(('127.0.0.1',8001),2);s.close()"] + interval: 30s + timeout: 5s + retries: 3