PHASE A COMPLETE: каждый агент теперь может жить в отдельном Docker Swarm контейнере как автономная единица.
- HTTP-сервер агента: GET /health, GET /info, POST /chat, POST /task, GET /tasks, GET /tasks/{id}, GET /memory
- Загружает конфиг из shared DB по AGENT_ID env var (model, systemPrompt, allowedTools)
- 4 горутины-воркера для параллельной обработки задач
- In-memory task queue (buffered channel, depth=100) + ring buffer последних 50 задач
- Callback URL: POST результата при завершении async задачи
- Sliding window памяти: загружает последние 20 сообщений из DB при каждом запросе
- Изолированные инструменты: агент получает только allowedTools из своей конфигурации
- Агент сам вызывает LLM напрямую через LLM_BASE_URL (не через Gateway)
- Graceful shutdown с таймаутом 15s
- 20 unit-тестов: все PASS
- Покрытие: инициализация, task queue, /health, /info, /task, /tasks, /memory, инструменты, lifecycle
- Multi-stage Go build: golang:1.23-alpine → alpine:3.21
- EXPOSE 8001, HEALTHCHECK на /health каждые 15s
- Агенты деплоятся динамически Swarm (не статический сервис в stack)
- Новые поля в таблице agents: serviceName, servicePort, containerImage, containerStatus
- SQL migration: drizzle/migrations/0006_agent_container_fields.sql
- AgentConfig + AgentRow: новые поля serviceName, servicePort, containerImage, containerStatus
- UpdateContainerStatus() — обновление статуса при деплое/остановке
- GetAgentHistory() — sliding window памяти агента из DB
- SaveHistory() — сохранение диалога агента в DB
- delegate_to_agent: реальный HTTP POST к контейнеру агента через overlay DNS
- sync: POST /chat (ждёт ответ)
- async: POST /task (возвращает task_id)
- fallback: если агент не запущен — информативное сообщение
- SetDatabase() — инжекция DB для резолва адресов живых агентов
- Orchestrator инжектирует DB в Executor через SetDatabase() при инициализации
46 lines
2.1 KiB
Docker
46 lines
2.1 KiB
Docker
# ─── Stage 1: Build ────────────────────────────────────────────────────────────
|
|
# Собираем agent-worker binary из исходников gateway/
|
|
FROM golang:1.23-alpine AS builder
|
|
|
|
WORKDIR /build
|
|
|
|
# Кэшируем зависимости отдельным слоем
|
|
COPY gateway/go.mod gateway/go.sum ./
|
|
RUN go mod download
|
|
|
|
# Копируем исходники
|
|
COPY gateway/ ./
|
|
|
|
# Собираем статически линкованный бинарь
|
|
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
|
|
go build -trimpath -ldflags="-s -w" \
|
|
-o agent-worker \
|
|
./cmd/agent-worker
|
|
|
|
# ─── Stage 2: Runtime ──────────────────────────────────────────────────────────
|
|
# Минимальный образ: только бинарь + CA certs (для HTTPS к LLM API)
|
|
FROM alpine:3.21
|
|
|
|
RUN apk add --no-cache ca-certificates tzdata
|
|
|
|
WORKDIR /app
|
|
|
|
COPY --from=builder /build/agent-worker /app/agent-worker
|
|
|
|
# Порт HTTP API агента (переопределяется через AGENT_PORT env)
|
|
EXPOSE 8001
|
|
|
|
# ── Healthcheck ──────────────────────────────────────────────────────────────
|
|
# Docker/Swarm будет проверять /health каждые 15 секунд
|
|
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
|
|
CMD wget -qO- http://localhost:${AGENT_PORT:-8001}/health || exit 1
|
|
|
|
# Required env vars (подставляются при деплое Swarm service):
|
|
# AGENT_ID — числовой ID агента из таблицы agents
|
|
# DATABASE_URL — mysql://user:pass@host:3306/goclaw
|
|
# LLM_BASE_URL — https://ollama.com/v1 или http://ollama:11434/v1
|
|
# LLM_API_KEY — ключ LLM провайдера
|
|
# AGENT_PORT — порт HTTP (default: 8001)
|
|
|
|
ENTRYPOINT ["/app/agent-worker"]
|