-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
184 lines (177 loc) · 7.23 KB
/
docker-compose.yml
File metadata and controls
184 lines (177 loc) · 7.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
services:
# Interactive runtime container — use with: docker compose run kelvin-host --prompt "..."
kelvin-host:
build:
context: .
dockerfile: docker/Dockerfile.runtime
container_name: kelvin-host
stdin_open: true
tty: true
environment:
KELVIN_HOME: /kelvin
KELVIN_PLUGIN_HOME: /kelvin/plugins
KELVIN_TRUST_POLICY_PATH: /kelvin/trusted_publishers.json
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-}
RUST_LOG: ${RUST_LOG:-info}
volumes:
- kelvin-home:/kelvin
networks:
- kelvin-network
depends_on:
kelvin-init:
condition: service_completed_successfully
# Init container — installs required plugins into the shared kelvin-home volume
# before the gateway starts. Uses KELVIN_MODEL_PROVIDER (default: kelvin.echo).
# Set KELVIN_MODEL_PROVIDER=kelvin.anthropic and ANTHROPIC_API_KEY to use Anthropic.
# Set KELVIN_MODEL_PROVIDER=kelvin.ollama and OLLAMA_BASE_URL to use Ollama.
kelvin-init:
build:
context: .
dockerfile: docker/Dockerfile.runtime
container_name: kelvin-init
environment:
KELVIN_HOME: /kelvin
KELVIN_PLUGIN_HOME: /kelvin/plugins
KELVIN_TRUST_POLICY_PATH: /kelvin/trusted_publishers.json
KELVIN_MODEL_PROVIDER: ${KELVIN_MODEL_PROVIDER:-kelvin.echo}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-}
BRAVE_API_KEY: ${BRAVE_API_KEY:-}
EXA_API_KEY: ${EXA_API_KEY:-}
RUST_LOG: ${RUST_LOG:-info}
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
mkdir -p /kelvin/plugins
[ -f /kelvin/trusted_publishers.json ] || \
printf '{"require_signature":false,"publishers":[]}' > /kelvin/trusted_publishers.json
/usr/local/bin/kelvin plugin install "${KELVIN_MODEL_PROVIDER:-kelvin.echo}"
/usr/local/bin/kelvin plugin install kelvin.cli
for d in /opt/kelvin/plugins-builtin/*/; do
[ -f "$${d}plugin.json" ] && /usr/local/bin/kelvin plugin install --from-dir "$$d" --force
done
volumes:
- kelvin-home:/kelvin
networks:
- kelvin-network
# WebSocket gateway — long-running service for agent channel ingress
kelvin-gateway:
build:
context: .
dockerfile: docker/Dockerfile.gateway
container_name: kelvin-gateway
environment:
KELVIN_HOME: /kelvin
KELVIN_PLUGIN_HOME: /kelvin/plugins
KELVIN_TRUST_POLICY_PATH: /kelvin/trusted_publishers.json
KELVIN_GATEWAY_TOKEN: ${KELVIN_GATEWAY_TOKEN:?KELVIN_GATEWAY_TOKEN must be set (see .env.example)}
KELVIN_GATEWAY_INGRESS_BIND: "0.0.0.0:34618"
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-}
BRAVE_API_KEY: ${BRAVE_API_KEY:-}
EXA_API_KEY: ${EXA_API_KEY:-}
KELVIN_TELEGRAM_ENABLED: ${KELVIN_TELEGRAM_ENABLED:-false}
KELVIN_TELEGRAM_BOT_TOKEN: ${KELVIN_TELEGRAM_BOT_TOKEN:-}
KELVIN_TELEGRAM_WEBHOOK_SECRET_TOKEN: ${KELVIN_TELEGRAM_WEBHOOK_SECRET_TOKEN:-}
KELVIN_TELEGRAM_PAIRING_ENABLED: ${KELVIN_TELEGRAM_PAIRING_ENABLED:-false}
KELVIN_TELEGRAM_ALLOW_CHAT_IDS: ${KELVIN_TELEGRAM_ALLOW_CHAT_IDS:-}
KELVIN_TELEGRAM_ALLOW_SENDER_IDS: ${KELVIN_TELEGRAM_ALLOW_SENDER_IDS:-}
KELVIN_TELEGRAM_OWNER_CHAT_IDS: ${KELVIN_TELEGRAM_OWNER_CHAT_IDS:-}
KELVIN_DISCORD_ENABLED: ${KELVIN_DISCORD_ENABLED:-false}
KELVIN_DISCORD_BOT_TOKEN: ${KELVIN_DISCORD_BOT_TOKEN:-}
KELVIN_DISCORD_ALLOW_SENDER_IDS: ${KELVIN_DISCORD_ALLOW_SENDER_IDS:-}
KELVIN_DISCORD_ALLOW_ACCOUNT_IDS: ${KELVIN_DISCORD_ALLOW_ACCOUNT_IDS:-}
KELVIN_CHANNEL_ROUTING_RULES_JSON: ${KELVIN_CHANNEL_ROUTING_RULES_JSON:-}
RUST_LOG: ${RUST_LOG:-info}
command:
- --bind
- "0.0.0.0:34617"
- --workspace
- /kelvin/workspace
- --allow-insecure-public-bind
- "true"
- --model-provider
- ${KELVIN_MODEL_PROVIDER:-kelvin.echo}
- --timeout-ms
- "${KELVIN_RUN_TIMEOUT_MS:-300000}"
volumes:
- kelvin-home:/kelvin
- kelvin-workspace:/kelvin/workspace
- ./ctf:/kelvin/ctf:ro
ports:
- "127.0.0.1:${KELVIN_GATEWAY_WS_PORT:-34617}:34617"
- "127.0.0.1:${KELVIN_GATEWAY_INGRESS_PORT:-34618}:34618"
networks:
- kelvin-network
depends_on:
kelvin-init:
condition: service_completed_successfully
restart: unless-stopped
# Plugin registry — optional HTTP service for plugin discovery
kelvin-registry:
build:
context: .
dockerfile: docker/Dockerfile.registry
container_name: kelvin-registry
environment:
KELVIN_PLUGIN_REGISTRY_BIND: "0.0.0.0:34619"
KELVIN_PLUGIN_REGISTRY_INDEX: /opt/kelvin/index.json
KELVIN_PLUGIN_REGISTRY_TRUST_POLICY: /opt/kelvin/trusted_publishers.json
RUST_LOG: ${RUST_LOG:-info}
volumes:
- ./index.json:/opt/kelvin/index.json:ro
- ./trusted_publishers.example.json:/opt/kelvin/trusted_publishers.json:ro
ports:
- "${KELVIN_PLUGIN_REGISTRY_PORT:-34619}:34619"
networks:
- kelvin-network
restart: unless-stopped
profiles:
- registry
- full
# TUI client — connects to kelvin-gateway over the internal Docker network
# Usage: docker compose run --rm kelvin-tui
# After exiting: docker compose down --remove-orphans
kelvin-tui:
build:
context: .
dockerfile: docker/Dockerfile.tui
container_name: kelvin-tui
init: true
stdin_open: true
tty: true
environment:
KELVIN_GATEWAY_TOKEN: ${KELVIN_GATEWAY_TOKEN:?KELVIN_GATEWAY_TOKEN must be set (see .env.example)}
command:
- --gateway-url
- "ws://kelvin-gateway:34617"
networks:
- kelvin-network
depends_on:
- kelvin-gateway
profiles:
- tui
# Test runner — tests execute during docker build, not at container runtime
# Usage: docker compose build kelvin-test
# To run quick lane: KELVIN_TEST_LANE=quick docker compose build kelvin-test
kelvin-test:
build:
context: .
dockerfile: docker/Dockerfile.test
target: ${KELVIN_TEST_LANE:-full}
image: kelvin-test:${KELVIN_TEST_LANE:-full}
profiles:
- test
volumes:
kelvin-home:
driver: local
kelvin-workspace:
driver: local
networks:
kelvin-network:
driver: bridge