REPO_ROOT := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) CHART_PATH := $(REPO_ROOT)/charts/llm-app AGENT_SRC := $(REPO_ROOT)/agent/agent.py AGENT_IMG := localhost/agent:0.1.0 CLUSTER := llm-local CONTEXT := kind-$(CLUSTER) export KIND_EXPERIMENTAL_PROVIDER=podman .PHONY: help help: @echo "Targets:" @echo " up-dev deploy dev LLM (Qwen2.5-0.5B, 2 replicas)" @echo " up-prod deploy prod LLM (Qwen2.5-1.5B, 1 replica + HPA 1->3)" @echo " up-agent up-prod + tool-using agent" @echo " ask Q='...' POST a question to the agent" @echo " down destroy everything + delete kind cluster" @echo "" @echo "URLs (after up-dev/up-prod):" @echo " Grafana http://grafana.localtest.me:8080 (admin/admin)" @echo " curl -f http://grafana.localtest.me:8080/api/health" @echo " Prometheus http://prom.localtest.me:8080" @echo " curl -f http://prom.localtest.me:8080/-/healthy" @echo "" .PHONY: up-dev up-dev: @kind get clusters | grep -qx $(CLUSTER) || kind create cluster --config $(REPO_ROOT)/cluster/kind-config.yaml cd $(REPO_ROOT)/terraform/envs/bootstrap && \ tofu init -upgrade && \ tofu apply -auto-approve \ -var kube_context=$(CONTEXT) cd $(REPO_ROOT)/terraform/envs/dev && \ tofu init -upgrade && \ tofu apply -auto-approve \ -var kube_context=$(CONTEXT) \ -var chart_path=$(CHART_PATH) .PHONY: up-prod up-prod: @kind get clusters | grep -qx $(CLUSTER) || kind create cluster --config $(REPO_ROOT)/cluster/kind-config.yaml cd $(REPO_ROOT)/terraform/envs/bootstrap && \ tofu init -upgrade && \ tofu apply -auto-approve \ -var kube_context=$(CONTEXT) cd $(REPO_ROOT)/terraform/envs/prod && \ tofu init -upgrade && \ tofu apply -auto-approve \ -var kube_context=$(CONTEXT) \ -var chart_path=$(CHART_PATH) .PHONY: up-agent up-agent: up-prod podman build -t $(AGENT_IMG) $(REPO_ROOT)/agent/ @tmp=$$(mktemp -t agent-XXXXXX.tar); \ podman save $(AGENT_IMG) -o $$tmp && \ kind load image-archive $$tmp --name $(CLUSTER) && \ rm -f $$tmp cd $(REPO_ROOT)/terraform/envs/agent && \ tofu init -upgrade && \ tofu apply -auto-approve \ -var kube_context=$(CONTEXT) \ -var agent_source_path=$(AGENT_SRC) .PHONY: ask ask: @if [ -z "$(Q)" ]; then echo "usage: make ask Q='what is 17*23?'"; exit 1; fi curl -s http://agent.localtest.me:8080/ask \ -H 'Content-Type: application/json' \ -d "$(shell printf '{"question":"%s"}' "$(Q)")" | python3 -m json.tool .PHONY: down down: -cd $(REPO_ROOT)/terraform/envs/agent && tofu destroy -auto-approve -var kube_context=$(CONTEXT) -var agent_source_path=$(AGENT_SRC) || true -cd $(REPO_ROOT)/terraform/envs/prod && tofu destroy -auto-approve -var kube_context=$(CONTEXT) -var chart_path=$(CHART_PATH) || true -cd $(REPO_ROOT)/terraform/envs/dev && tofu destroy -auto-approve -var kube_context=$(CONTEXT) -var chart_path=$(CHART_PATH) || true -cd $(REPO_ROOT)/terraform/envs/bootstrap && tofu destroy -auto-approve -var kube_context=$(CONTEXT) || true KIND_EXPERIMENTAL_PROVIDER=podman kind delete cluster --name $(CLUSTER)