.PHONY: service webui dev remotedev test build clean export PATH := $(HOME)/.local/go/bin:$(PATH) # Optional local overrides (gitignored): REMOTEDEV_USER, REMOTEDEV_HOST, etc. -include remotedev.mk REMOTEDEV_DIR ?= clustercanvas-remotedev PORT ?= 8080 WEBUI_PORT ?= 5173 # Dev-only AES key for remotedev (base64 of 32 bytes). Override in remotedev.mk if needed. # NOT for production. REMOTEDEV_CONFIG_KEY ?= Q2x1c3RlckNhbnZhcy1yZW1vdGVkZXYta2V5ISEhISE= # Build SSH target from prepared user+host, or use REMOTEDEV_HOST as-is (user@host / SSH alias). ifneq ($(strip $(REMOTEDEV_USER)),) REMOTEDEV_SSH := $(REMOTEDEV_USER)@$(REMOTEDEV_HOST) else REMOTEDEV_SSH := $(REMOTEDEV_HOST) endif # pkill -x cannot match names longer than 15 chars (Linux /proc/*/comm). Use -f on argv. # Stop before scp so running binaries are not busy when overwritten. REMOTEDEV_KILL = pkill -f './clustercanvas-server( |$$)' >/dev/null 2>&1 || true; \ pkill -f './clustercanvas-webui( |$$)' >/dev/null 2>&1 || true; \ sleep 0.2 service: cd service && go run ./cmd/server webui: cd webui && npm run dev # Run API (:8080) and web UI (:5173) together; Ctrl+C stops both. # Export CLUSTERCANVAS_CONFIG_KEY in your shell (or remotedev.mk) before first-run setup. dev: @trap 'kill 0' EXIT INT TERM; \ (cd service && go run ./cmd/server) & \ (cd webui && npm run dev) & \ wait # Build locally, copy binaries + SPA to a VM over SSH, run both there (no SDKs on remote). # Prepare remotedev.mk with REMOTEDEV_USER + REMOTEDEV_HOST, or pass them on the CLI. # Usage: make remotedev # or: REMOTEDEV_HOST=user@192.168.1.50 make remotedev remotedev: @test -n "$(REMOTEDEV_HOST)" || (echo 'Set REMOTEDEV_HOST (and optional REMOTEDEV_USER) in remotedev.mk or on the CLI'; exit 1) mkdir -p bin cd service && go build -o ../bin/clustercanvas-server ./cmd/server cd service && go build -o ../bin/clustercanvas-webui ./cmd/webui cd webui && VITE_API_BASE_URL= npm run build # scp only needs OpenSSH on the remote (rsync is often missing on minimal VMs). # Leave ~ unquoted so the remote shell expands REMOTEDEV_DIR=~/... correctly. ssh "$(REMOTEDEV_SSH)" "mkdir -p $(REMOTEDEV_DIR)/web $(REMOTEDEV_DIR)/config" ssh "$(REMOTEDEV_SSH)" "cd $(REMOTEDEV_DIR) 2>/dev/null || true; $(REMOTEDEV_KILL)" scp bin/clustercanvas-server bin/clustercanvas-webui "$(REMOTEDEV_SSH):$(REMOTEDEV_DIR)/" ssh "$(REMOTEDEV_SSH)" "rm -rf $(REMOTEDEV_DIR)/web && mkdir -p $(REMOTEDEV_DIR)/web" scp -r webui/dist/. "$(REMOTEDEV_SSH):$(REMOTEDEV_DIR)/web/" @echo "Starting on $(REMOTEDEV_SSH) — open http://:$(WEBUI_PORT) (Ctrl+C stops both)" # Kill in a separate ssh so pkill -f cannot match this start script's own argv. ssh "$(REMOTEDEV_SSH)" "cd $(REMOTEDEV_DIR) 2>/dev/null || true; $(REMOTEDEV_KILL)" ssh -t "$(REMOTEDEV_SSH)" "cd $(REMOTEDEV_DIR) && \ trap 'kill 0' EXIT INT TERM; \ export CLUSTERCANVAS_CONFIG_KEY='$(REMOTEDEV_CONFIG_KEY)'; \ export CLUSTERCANVAS_CONFIG_DIR=\"\$$PWD/config\"; \ PORT=$(PORT) ./clustercanvas-server -configdir=config & \ WEBUI_PORT=$(WEBUI_PORT) API_URL=http://127.0.0.1:$(PORT) ./clustercanvas-webui -webdir=web -configdir=config & \ wait" test: cd service && go test ./... cd webui && npm test build: mkdir -p bin cd service && go build -o ../bin/clustercanvas-server ./cmd/server cd service && go build -o ../bin/clustercanvas-webui ./cmd/webui cd webui && npm run build clean: rm -rf bin service/coverage.out webui/dist webui/coverage