-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathMakefile
More file actions
388 lines (328 loc) · 12.9 KB
/
Makefile
File metadata and controls
388 lines (328 loc) · 12.9 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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
# Copyright (c) Ultraviolet
# SPDX-License-Identifier: Apache-2.0
CUBE_PROXY_DOCKER_IMAGE_NAME ?= ghcr.io/ultravioletrs/cube/proxy
CUBE_AGENT_DOCKER_IMAGE_NAME ?= ghcr.io/ultravioletrs/cube/agent
CUBE_GUARDRAILS_DOCKER_IMAGE_NAME ?= ghcr.io/ultravioletrs/cube/guardrails
CGO_ENABLED ?= 0
GOOS ?= linux
GOARCH ?= amd64
BUILD_DIR = build
TIME=$(shell date -u '+%Y-%m-%dT%H:%M:%SZ')
VERSION ?= $(shell git describe --abbrev=0 --tags 2>/dev/null || echo 'v0.0.0')
COMMIT ?= $(shell git rev-parse HEAD)
AI_BACKEND ?= ollama
OLLAMA_TARGET_URL = http://ollama:11434
VLLM_TARGET_URL = http://vllm:8000
ENV_FILE = ./docker/.env
CONFIG_FILE = ./docker/config.json
define compile_service
CGO_ENABLED=$(CGO_ENABLED) GOOS=$(GOOS) GOARCH=$(GOARCH) \
go build -ldflags "-s -w \
-X 'github.com/absmach/supermq.BuildTime=$(TIME)' \
-X 'github.com/absmach/supermq.Version=$(VERSION)' \
-X 'github.com/absmach/supermq.Commit=$(COMMIT)'" \
-o ${BUILD_DIR}/cube-$(1) cmd/$(1)/main.go
endef
define make_docker
docker build \
--no-cache \
--build-arg SVC=$(1) \
--build-arg GOOS=$(GOOS) \
--build-arg GOARCH=$(GOARCH) \
--build-arg VERSION=$(VERSION) \
--build-arg COMMIT=$(COMMIT) \
--tag=$(2):$(VERSION) \
--tag=$(2):latest \
-f docker/Dockerfile .
endef
define make_docker_dev
docker build \
--no-cache \
--build-arg SVC=$(1) \
--tag=$(2):$(VERSION) \
--tag=$(2):latest \
-f docker/Dockerfile.dev ./build
endef
define docker_push
docker push $(1):$(VERSION)
docker push $(1):latest
endef
define update_env_var
@if [ -f $(ENV_FILE) ]; then \
if grep -q "^$(1)=" $(ENV_FILE); then \
sed -i 's|^$(1)=.*|$(1)=$(2)|' $(ENV_FILE); \
else \
echo "$(1)=$(2)" >> $(ENV_FILE); \
fi; \
else \
echo "$(1)=$(2)" > $(ENV_FILE); \
fi
@echo "Updated $(1) to $(2)"
endef
.PHONY: build
build: build-proxy build-agent
.PHONY: build-proxy
build-proxy:
$(call compile_service,proxy)
.PHONY: build-agent
build-agent:
$(call compile_service,agent)
.PHONY: docker
docker: docker-proxy docker-agent docker-guardrails
.PHONY: docker-proxy
docker-proxy:
$(call make_docker,proxy,$(CUBE_PROXY_DOCKER_IMAGE_NAME))
.PHONY: docker-agent
docker-agent:
$(call make_docker,agent,$(CUBE_AGENT_DOCKER_IMAGE_NAME))
.PHONY: docker-guardrails
docker-guardrails:
docker build \
--no-cache \
--tag=$(CUBE_GUARDRAILS_DOCKER_IMAGE_NAME):$(VERSION) \
--tag=$(CUBE_GUARDRAILS_DOCKER_IMAGE_NAME):latest \
-f guardrails/Dockerfile ./guardrails
.PHONY: docker-guardrails-dev
docker-guardrails-dev:
docker build \
--tag=$(CUBE_GUARDRAILS_DOCKER_IMAGE_NAME):$(VERSION) \
--tag=$(CUBE_GUARDRAILS_DOCKER_IMAGE_NAME):latest \
-f guardrails/Dockerfile.dev .
.PHONY: guardrails-venv
guardrails-venv:
@echo "Setting up guardrails virtual environment in root .venv..."
python -m venv .venv
. .venv/bin/activate && pip install --upgrade pip && pip install -r guardrails/requirements.txt
. .venv/bin/activate && python -m spacy download en_core_web_lg
@echo "Guardrails venv created successfully at .venv"
.PHONY: docker-dev
docker-dev: docker-proxy-dev docker-agent-dev docker-guardrails-dev
.PHONY: docker-proxy-dev
docker-proxy-dev:
$(call make_docker_dev,proxy,$(CUBE_PROXY_DOCKER_IMAGE_NAME))
.PHONY: docker-agent-dev
docker-agent-dev:
$(call make_docker_dev,agent,$(CUBE_AGENT_DOCKER_IMAGE_NAME))
.PHONY: config-ollama
config-ollama:
$(call update_env_var,UV_CUBE_AGENT_TARGET_URL,$(OLLAMA_TARGET_URL))
@echo "Configured for Ollama backend"
.PHONY: config-vllm
config-vllm:
$(call update_env_var,UV_CUBE_AGENT_TARGET_URL,$(VLLM_TARGET_URL))
@echo "Configured for vLLM backend"
.PHONY: config-backend
config-backend:
ifeq ($(AI_BACKEND),vllm)
@$(MAKE) config-vllm
else ifeq ($(AI_BACKEND),ollama)
@$(MAKE) config-ollama
else
@echo "Invalid AI_BACKEND: $(AI_BACKEND). Use 'ollama' or 'vllm'"
@exit 1
endif
.PHONY: up-ollama
up-ollama: config-ollama
@echo "Starting Cube with Ollama backend..."
docker compose -f docker/compose.yaml --profile default up -d
.PHONY: up-vllm
up-vllm: config-vllm
@echo "Starting Cube with vLLM backend..."
docker compose -f docker/compose.yaml --profile vllm up -d
GUARDRAILS_CONFIG_FILE = ./guardrails/rails/config.yml
.PHONY: config-guardrails-vllm
config-guardrails-vllm:
@echo "Configuring guardrails for vLLM backend..."
@sed -i '/^models:/,/X-Guardrails-Request:/{s/engine: CubeLLM/engine: CubeVLLM/; s/model: llama3.2:3b/model: microsoft\/DialoGPT-medium/}' $(GUARDRAILS_CONFIG_FILE)
@echo "Guardrails configured for vLLM"
.PHONY: config-guardrails-ollama
config-guardrails-ollama:
@echo "Configuring guardrails for Ollama backend..."
@sed -i '/^models:/,/X-Guardrails-Request:/{s/engine: CubeVLLM/engine: CubeLLM/; s/model: microsoft\/DialoGPT-medium/model: llama3.2:3b/}' $(GUARDRAILS_CONFIG_FILE)
@echo "Guardrails configured for Ollama"
.PHONY: up-vllm-guardrails
up-vllm-guardrails: enable-guardrails config-guardrails-vllm up-vllm
.PHONY: disable-atls
disable-atls:
@if grep -q '^UV_CUBE_AGENT_ATTESTED_TLS=true' docker/.env; then \
echo "Disabling attested TLS for local development..."; \
sed -i 's|^UV_CUBE_AGENT_CLIENT_CERT=.*|UV_CUBE_AGENT_CLIENT_CERT=|' docker/.env; \
sed -i 's|^UV_CUBE_AGENT_CLIENT_KEY=.*|UV_CUBE_AGENT_CLIENT_KEY=|' docker/.env; \
sed -i 's|^UV_CUBE_AGENT_SERVER_CA_CERTS=.*|UV_CUBE_AGENT_SERVER_CA_CERTS=|' docker/.env; \
sed -i 's|^UV_CUBE_AGENT_ATTESTED_TLS=.*|UV_CUBE_AGENT_ATTESTED_TLS=false|' docker/.env; \
sed -i 's|^UV_CUBE_AGENT_ATTESTATION_POLICY=.*|UV_CUBE_AGENT_ATTESTATION_POLICY=|' docker/.env; \
echo "✓ Attested TLS disabled"; \
else \
echo "✓ Attested TLS already configured, skipping"; \
fi
.PHONY: up
up: config-local enable-guardrails config-backend disable-atls
ifeq ($(AI_BACKEND),vllm)
@$(MAKE) up-vllm
else
@$(MAKE) up-ollama
endif
.PHONY: up-disable-guardrails
up-disable-guardrails: config-cloud-local disable-guardrails config-backend disable-atls
ifeq ($(AI_BACKEND),vllm)
@$(MAKE) up-vllm
else
@$(MAKE) up-ollama
endif
.PHONY: config-local
config-local:
@echo "Configuring for local development..."
@sed -i 's|__SMQ_EMAIL_HOST__|localhost|g' docker/.env
@sed -i 's|__SMQ_EMAIL_PORT__|1025|g' docker/.env
@sed -i 's|__SMQ_EMAIL_USERNAME__|test|g' docker/.env
@sed -i 's|__SMQ_EMAIL_PASSWORD__|test|g' docker/.env
@sed -i 's|__SMQ_EMAIL_FROM_ADDRESS__|noreply@localhost|g' docker/.env
@sed -i 's|__CUBE_INTERNAL_AGENT_URL__|http://cube-agent:8901|g' docker/.env
@sed -i 's|__CUBE_INTERNAL_AGENT_URL__|http://cube-agent:8901|g' docker/config.json
@sed -i 's|__CUBE_DOMAIN__|localhost|g' docker/traefik/dynamic.toml
@sed -i 's|__SMQ_GOOGLE_CLIENT_ID__||g' docker/.env
@sed -i 's|__SMQ_GOOGLE_CLIENT_SECRET__||g' docker/.env
@sed -i 's|__SMQ_GOOGLE_STATE__||g' docker/.env
@sed -i 's|__MG_MAILCHIMP_API_KEY__||g' docker/.env
@sed -i 's|__MG_MAILCHIMP_SERVER_PREFIX__||g' docker/.env
@sed -i 's|__MG_MAILCHIMP_AUDIENCE_ID__||g' docker/.env
@sed -i 's|__CUBE_PUBLIC_URL__|localhost|g' docker/.env
@sed -i 's|__TRAEFIK_HTTP_PORT__|80|g' docker/.env
@sed -i 's|__TRAEFIK_HTTPS_PORT__|443|g' docker/.env
@sed -i 's|__TRAEFIK_DASHBOARD_PORT__|8080|g' docker/.env
@sed -i 's|__TUNNEL_TOKEN__||g' docker/.env
@sed -i 's|__CUBE_AGENT_CERTS_TOKEN__|localdevtoken12we12we12we12we12we|g' docker/.env
@sed -i "s|__NEXTAUTH_SECRET__|$(shell python3 -c 'import secrets; print(secrets.token_urlsafe(37))')|g" docker/.env
@echo "✓ Configured with local defaults"
.PHONY: restore-config
restore-config:
@echo "Restoring configuration placeholders..."
@git checkout -- docker/.env docker/traefik/dynamic.toml docker/config.json $(GUARDRAILS_CONFIG_FILE) 2>/dev/null && \
echo "✓ Restored from git" || echo "⚠ git restore failed, files may not be tracked"
.PHONY: down
down:
@echo "Stopping all Cube services..."
docker compose -f docker/compose.yaml down
.PHONY: down-volumes
down-volumes:
@echo "Stopping all Cube services and removing volumes..."
docker compose -f docker/compose.yaml down -v
.PHONY: restart
restart: down up
.PHONY: restart-ollama
restart-ollama: down up-ollama
.PHONY: restart-vllm
restart-vllm: down up-vllm
.PHONY: logs
logs:
docker compose -f docker/compose.yaml logs -f
.PHONY: logs-cloud
logs-cloud:
docker compose -f docker/compose.yaml --profile cloud logs -f
.PHONY: dev-setup
dev-setup: build docker-dev
.PHONY: show-config
show-config:
@echo "=== Current Configuration ==="
@echo "AI Backend: $(AI_BACKEND)"
@echo "Ollama Target: $(OLLAMA_TARGET_URL)"
@echo "vLLM Target: $(VLLM_TARGET_URL)"
@echo ""
@if [ -f $(ENV_FILE) ]; then \
echo "=== Environment Variables ==="; \
grep -E "(UV_CUBE_AGENT_TARGET_URL|VLLM_MODEL)" $(ENV_FILE) 2>/dev/null || echo "No AI backend variables configured"; \
fi
.PHONY: clean-env
clean-env:
@echo "Cleaning environment configuration..."
@if [ -f $(ENV_FILE) ]; then \
sed -i '/^UV_CUBE_AGENT_TARGET_URL=/d' $(ENV_FILE); \
echo "Removed UV_CUBE_AGENT_TARGET_URL from $(ENV_FILE)"; \
fi
.PHONY: enable-guardrails
enable-guardrails:
@echo "Enabling guardrails in config.json..."
@sed -i '/"name": "guardrails-agent"/,/"enabled":/{s/"enabled": false/"enabled": true/}' $(CONFIG_FILE)
@sed -i '/"name": "forward-to-guardrails"/,/"enabled":/{s/"enabled": false/"enabled": true/}' $(CONFIG_FILE)
@sed -i '/"name": "guardrails-admin"/,/"enabled":/{s/"enabled": false/"enabled": true/}' $(CONFIG_FILE)
@echo "Guardrails enabled"
.PHONY: disable-guardrails
disable-guardrails:
@echo "Disabling guardrails in config.json..."
@sed -i '/"name": "guardrails-agent"/,/"enabled":/{s/"enabled": true/"enabled": false/}' $(CONFIG_FILE)
@sed -i '/"name": "forward-to-guardrails"/,/"enabled":/{s/"enabled": true/"enabled": false/}' $(CONFIG_FILE)
@sed -i '/"name": "guardrails-admin"/,/"enabled":/{s/"enabled": true/"enabled": false/}' $(CONFIG_FILE)
@echo "Guardrails disabled"
# Help
.PHONY: help
help:
@echo "Cube AI - Available Commands:"
@echo ""
@echo "Build Commands:"
@echo " build Build all services"
@echo " build-proxy Build proxy service"
@echo " build-agent Build agent service"
@echo " docker Build Docker images"
@echo " docker-guardrails Build Nemo Guardrails Docker image"
@echo " docker-dev Build development Docker images"
@echo ""
@echo "Configuration Commands:"
@echo " config-ollama Configure for Ollama backend"
@echo " config-vllm Configure for vLLM backend"
@echo " config-guardrails-vllm Configure guardrails config.yml for vLLM"
@echo " config-guardrails-ollama Configure guardrails config.yml for Ollama"
@echo " enable-guardrails Enable guardrails routes in config.json"
@echo " disable-guardrails Disable guardrails routes in config.json"
@echo " show-config Show current configuration"
@echo " clean-env Clean environment configuration"
@echo ""
@echo "Deployment Commands:"
@echo " up Start with guardrails enabled (default)"
@echo " up-disable-guardrails Start without guardrails"
@echo " up-ollama Start with Ollama backend (pulls models automatically)"
@echo " up-vllm Start with vLLM backend"
@echo " up-vllm-guardrails Start with vLLM backend and guardrails enabled"
@echo " up-cloud Start cloud deployment using cloud-compose.yaml"
@echo " down Stop all services"
@echo " down-cloud Stop cloud services and restore config"
@echo " down-volumes Stop all services and remove volumes"
@echo " down-cloud-volumes Stop cloud services, remove volumes, and restore config"
@echo " restart Restart with configured backend"
@echo " restart-cloud Restart cloud deployment"
@echo ""
@echo "Cloud Configuration Commands:"
@echo " config-cloud-local Configure cloud deployment with localhost defaults"
@echo " restore-config Restore placeholder values in config files"
@echo ""
@echo "Logs:"
@echo " logs Show all logs"
@echo " logs-cloud Show cloud deployment logs"
@echo ""
@echo "Examples:"
@echo " make up # Start with guardrails (default)"
@echo " make up-disable-guardrails # Start without guardrails"
@echo " make up AI_BACKEND=vllm # Start with vLLM + guardrails"
@echo " make up-ollama # Start with Ollama (pulls models)"
@echo " make up-cloud # Start cloud deployment locally"
all: build docker-dev
clean:
rm -rf build
lint:
golangci-lint run --config .golangci.yaml
.PHONY: latest
latest: docker docker-push
.PHONY: docker-push
docker-push: docker-push-proxy docker-push-agent docker-push-guardrails
.PHONY: docker-push-proxy
docker-push-proxy:
$(call docker_push,$(CUBE_PROXY_DOCKER_IMAGE_NAME))
.PHONY: docker-push-agent
docker-push-agent:
$(call docker_push,$(CUBE_AGENT_DOCKER_IMAGE_NAME))
.PHONY: mocks
mocks:
mockery --config ./.mockery.yml
.PHONY: docker-push-guardrails
docker-push-guardrails:
$(call docker_push,$(CUBE_GUARDRAILS_DOCKER_IMAGE_NAME))
.DEFAULT_GOAL := help