Files
Squid 458f14e74f Fix remotedev scp failing when prior binaries are still running.
Stop remote processes with pkill -f before upload so long binary names are matched and busy executables can be overwritten.
2026-07-18 15:23:29 +02:00

82 lines
3.4 KiB
Makefile

.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://<vm-ip>:$(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