Files
GoClaw/docker/Dockerfile.agent-worker
bboxwtf 153399f41e feat(phase-A): agent-worker container — autonomous agent HTTP server
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() при инициализации
2026-03-31 23:11:02 +00:00

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"]