Skip to content

Commit 2cf7828

Browse files
committed
chore(docker): add Dockerfile, compose stack, and observability configs
1 parent 712f5ac commit 2cf7828

4 files changed

Lines changed: 172 additions & 0 deletions

File tree

Dockerfile

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# Stage 1: Build
2+
FROM node:22-alpine AS builder
3+
4+
WORKDIR /app
5+
6+
# Copy package files
7+
COPY package.json package-lock.json ./
8+
9+
# Install dependencies (full install for build)
10+
RUN npm ci && npm cache clean --force
11+
12+
# Copy source
13+
COPY tsconfig.json ./
14+
COPY src ./src
15+
16+
# Build
17+
RUN npm run build
18+
19+
# Stage 2: Install production deps only
20+
FROM node:22-alpine AS prod-deps
21+
22+
WORKDIR /app
23+
24+
COPY package.json package-lock.json ./
25+
RUN npm ci --only=production && npm cache clean --force
26+
27+
# Stage 3: Runtime
28+
FROM node:22-alpine AS runtime
29+
30+
WORKDIR /app
31+
32+
# Install dumb-init for proper signal handling
33+
RUN apk add --no-cache dumb-init
34+
35+
# Create non-root user
36+
RUN addgroup -g 1001 -S nodejs && \
37+
adduser -S nodejs -u 1001
38+
39+
# Copy built artifacts and prod deps
40+
COPY --from=prod-deps --chown=nodejs:nodejs /app/node_modules ./node_modules
41+
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
42+
COPY --from=builder --chown=nodejs:nodejs /app/package.json ./
43+
44+
# Switch to non-root user
45+
USER nodejs
46+
47+
# Health check
48+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
49+
CMD node dist/healthcheck.js || exit 1
50+
51+
# Expose port for MCP server
52+
EXPOSE 3000
53+
54+
# Default command
55+
CMD ["node", "dist/cli.js"]

docker-compose.yml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
version: '3.8'
2+
3+
services:
4+
# Main agent-eval-harness service
5+
agent-eval-harness:
6+
build:
7+
context: .
8+
dockerfile: Dockerfile
9+
ports:
10+
- "3000:3000"
11+
environment:
12+
- NODE_ENV=development
13+
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
14+
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
15+
- OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
16+
volumes:
17+
- ./trajectories:/app/trajectories
18+
- ./results:/app/results
19+
- ./golden:/app/golden
20+
depends_on:
21+
- otel-collector
22+
command: ["node", "dist/cli.js", "serve", "--port", "3000", "--host", "0.0.0.0"]
23+
24+
# OpenTelemetry Collector
25+
otel-collector:
26+
image: otel/opentelemetry-collector:latest
27+
ports:
28+
- "4317:4317" # OTLP gRPC
29+
- "4318:4318" # OTLP HTTP
30+
volumes:
31+
- ./otel-collector-config.yaml:/etc/otel/config.yaml
32+
command: ["--config", "/etc/otel/config.yaml"]
33+
34+
# Jaeger for tracing visualization
35+
jaeger:
36+
image: jaegertracing/all-in-one:latest
37+
ports:
38+
- "16686:16686" # Jaeger UI
39+
- "14268:14268" # Jaeger ingest
40+
environment:
41+
- COLLECTOR_OTLP_ENABLED=true
42+
43+
# TODO: Replace with actual mock LLM image
44+
# mock-llm:
45+
# image: TODO
46+
# ports:
47+
# - "8080:8080"
48+
# environment:
49+
# - PORT=8080
50+
# - MOCK_RESPONSES=true
51+
52+
# Prometheus for metrics
53+
prometheus:
54+
image: prom/prometheus:latest
55+
ports:
56+
- "9090:9090"
57+
volumes:
58+
- ./prometheus.yaml:/etc/prometheus/prometheus.yml
59+
command:
60+
- '--config.file=/etc/prometheus/prometheus.yml'
61+
- '--storage.tsdb.path=/prometheus'
62+
- '--web.console.libraries=/etc/prometheus/console_libraries'
63+
- '--web.console.templates=/etc/prometheus/consoles'
64+
65+
# Grafana for dashboards
66+
grafana:
67+
image: grafana/grafana:latest
68+
ports:
69+
- "3001:3000"
70+
environment:
71+
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin}
72+
volumes:
73+
- grafana-data:/var/lib/grafana
74+
depends_on:
75+
- prometheus
76+
77+
volumes:
78+
grafana-data:

otel-collector-config.yaml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
receivers:
2+
otlp:
3+
protocols:
4+
grpc:
5+
endpoint: 0.0.0.0:4317
6+
http:
7+
endpoint: 0.0.0.0:4318
8+
9+
processors:
10+
batch:
11+
timeout: 5s
12+
send_batch_size: 1024
13+
14+
exporters:
15+
logging:
16+
loglevel: warn
17+
otlp/jaeger:
18+
endpoint: jaeger:4317
19+
tls:
20+
insecure: true
21+
22+
service:
23+
pipelines:
24+
traces:
25+
receivers: [otlp]
26+
processors: [batch]
27+
exporters: [logging, otlp/jaeger]
28+
metrics:
29+
receivers: [otlp]
30+
processors: [batch]
31+
exporters: [logging]

prometheus.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
global:
2+
scrape_interval: 15s
3+
evaluation_interval: 15s
4+
5+
scrape_configs:
6+
- job_name: 'agent-eval-harness'
7+
static_configs:
8+
- targets: ['agent-eval-harness:9464']

0 commit comments

Comments
 (0)