Skip to content

Deployment

Agent One is a single Go binary. It runs anywhere Go runs — your laptop, a VPS, EC2, or a container. Docker is optional, never required.

Terminal window
# Build a static binary
go build -o agent-one ./cmd/agent
# Run with config in current directory
./agent-one
# Or specify a config path
./agent-one --config /etc/agent-one/config.yaml

Use GoReleaser for reproducible cross-platform builds:

Terminal window
# Local test build
goreleaser release --snapshot --clean
# Full release (creates GitHub release + binaries)
goreleaser release

Supported targets:

OSArchitecture
Linuxamd64, arm64
macOSamd64, arm64
Windowsamd64

All builds use CGO_ENABLED=0 for fully static binaries with no external dependencies.

For always-on deployment on Linux:

[Unit]
Description=Agent One
After=network.target
[Service]
Type=simple
User=agentone
WorkingDirectory=/opt/agent-one
ExecStart=/opt/agent-one/agent-one --config /opt/agent-one/config.yaml
Restart=always
RestartSec=5
Environment=LITELLM_API_KEY=your-key
Environment=GITHUB_TOKEN=your-token
[Install]
WantedBy=multi-user.target
Terminal window
sudo systemctl enable agent-one
sudo systemctl start agent-one

Docker is optional but convenient for running Agent One alongside LiteLLM.

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o agent-one ./cmd/agent
FROM alpine:3.19
RUN apk add --no-cache ca-certificates
COPY --from=builder /app/agent-one /usr/local/bin/
COPY config.yaml /etc/agent-one/
CMD ["agent-one", "--config", "/etc/agent-one/config.yaml"]

Run Agent One + LiteLLM together:

version: "3.8"
services:
litellm:
image: ghcr.io/berriai/litellm:main-latest
ports:
- "4000:4000"
volumes:
- ./litellm_config.yaml:/app/config.yaml
command: ["--config", "/app/config.yaml"]
agent-one:
build: .
depends_on:
- litellm
volumes:
- ./config.yaml:/etc/agent-one/config.yaml
- ./data:/data
environment:
- LITELLM_API_KEY=${LITELLM_API_KEY}
- GITHUB_TOKEN=${GITHUB_TOKEN}
ports:
- "9090:9090" # Webhooks
- "4200:4200" # Web portal

The same binary supports three modes, differentiated by config:

Single user, single config, single SQLite database. No authentication needed — you own the binary.

agent:
name: "My Assistant"

One owner + team members. RBAC with 4 roles.

safety:
rbac: true
RoleChatConfigHandsApprove PlansAuditManage Members
owneryesyesyesyesyesyes
adminyesnoyesyesyesno
memberyesnonononono
guestnononononono

Multiple isolated tenants on the same binary. Each tenant gets its own config, database, channels, and budget.

tenants:
- id: "Esteban"
config: "tenants/Esteban/config.yaml"
db_path: "tenants/Esteban/agent.db"
channels: ["cli", "whatsapp"]
- id: "cronoss"
config: "tenants/cronoss/config.yaml"
db_path: "tenants/cronoss/agent.db"
channels: ["whatsapp-cronoss", "telegram-cronoss"]

No shared state between tenants. Budget tracked independently. Tenant resolution by channel.

The web portal runs on a configurable port (default 4200):

portal:
enabled: true
port: 4200

Access it at http://localhost:4200. In production, put it behind a reverse proxy (nginx, Caddy) with TLS.

MetricTarget
Binary size< 30 MB
Startup time< 2 seconds
Idle memory< 50 MB
Average response latency< 3 seconds (cheap model)
Go module dependencies< 15

Agent One exposes health endpoints and supports observability via:

  • slog structured logging to stderr
  • OpenTelemetry tracing on critical paths (agent loop, LLM calls, tool execution)
  • Metrics — message count, latency, token usage, cost, queue depth
  • doctor command — diagnose configuration and connectivity issues
Terminal window
./agent-one doctor # Check LiteLLM connection, MCP servers, channel configs