pulse-lets-go/Makefile
Maksim Totmin 2917f4de44 fix: build system — findWebDir order, auto-copy web static to bin
* findWebDir: CWD and project root checked before binary-adjacent path,
  so dev always serves fresh web/build/ over stale bin/web/build/
* build-go: auto-copies web/build/ to bin/web/ before Go compile
* build-prod: same auto-copy for production builds
* Proper refresh of frontend static on every make build
2026-06-25 19:30:49 +07:00

183 lines
5.7 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# pulse-lets-go — Telephone Load Balancer
# Сборка Go backend + SvelteKit фронта в единый бинарник.
APP := pulse-lets-go
BINDIR := bin
WEB_DIR := web
DATA_DIR := data
.PHONY: all build build-go build-web clean run test install \
emulate emulate-normal emulate-overload emulate-cpu-low emulate-fail-high \
emulate-node-down emulate-stale emulate-chaos build-emulator \
build-siptest siptest-uas siptest-uac siptest-full
all: build
# Полная сборка: фронт + бекенд
build: build-web build-go
@echo "✓ Сборка завершена: $(BINDIR)/$(APP)"
# Сборка SvelteKit фронта
build-web:
@echo "→ Сборка SvelteKit..."
cd $(WEB_DIR) && npm run build
# Сборка Go бинарника (с авто-копированием статики)
build-go:
@mkdir -p $(BINDIR)
@echo "→ Сборка Go backend..."
@if [ -d $(WEB_DIR)/build ]; then \
rm -rf $(BINDIR)/web && cp -r $(WEB_DIR)/build $(BINDIR)/web; \
echo " статика скопирована в $(BINDIR)/web/"; \
fi
go build -o $(BINDIR)/$(APP) ./cmd/$(APP)
# Быстрая сборка только Go (без фронта, без статики)
build-go-only:
@mkdir -p $(BINDIR)
go build -o $(BINDIR)/$(APP) ./cmd/$(APP)
# Запуск в dev-режиме: Go backend на :8080, SvelteKit dev server на :5173
run:
@echo "→ Запуск pulse-lets-go (dev)"
$(BINDIR)/$(APP) &
cd $(WEB_DIR) && npm run dev
# Продакшн сборка с оптимизациями
build-prod:
@mkdir -p $(BINDIR)
cd $(WEB_DIR) && npm run build
rm -rf $(BINDIR)/web && cp -r $(WEB_DIR)/build $(BINDIR)/web
CGO_ENABLED=0 go build -ldflags="-s -w" -o $(BINDIR)/$(APP) ./cmd/$(APP)
# Установка: копирует бинарник и статику в /usr/local
install: build
@echo "→ Установка в /usr/local"
mkdir -p /usr/local/share/$(APP)/web
cp -r $(WEB_DIR)/build /usr/local/share/$(APP)/web/
cp $(BINDIR)/$(APP) /usr/local/bin/$(APP)
chmod +x /usr/local/bin/$(APP)
@echo "✓ Установлен в /usr/local/bin/$(APP)"
# Установка systemd unit
install-systemd:
@echo "→ Установка systemd unit"
cp deploy/$(APP).service /etc/systemd/system/
systemctl daemon-reload
@echo "✓ systemd unit установлен. Запуск: systemctl start $(APP)"
# ============================================================
# Эмулятор метрик
# ============================================================
# Сборка эмулятора
build-emulator:
@mkdir -p $(BINDIR)
go build -o $(BINDIR)/emulator ./cmd/emulator
# По умолчанию — normal
emulate: emulate-normal
# Все ноды здоровы, случайная загрузка
emulate-normal: nats build-emulator
./$(BINDIR)/emulator --scenario normal
# Последняя нода перегружена (active_calls=max_calls)
emulate-overload: nats build-emulator
./$(BINDIR)/emulator --scenario overload
# Последняя нода с низким idle_cpu (< 5)
emulate-cpu-low: nats build-emulator
./$(BINDIR)/emulator --scenario cpu-low
# Последняя нода с высоким call_failure_rate (> 15)
emulate-fail-high: nats build-emulator
./$(BINDIR)/emulator --scenario fail-high
# Последняя нода status="down"
emulate-node-down: nats build-emulator
./$(BINDIR)/emulator --scenario node-down
# Первая нода замолкает через 10 сек (stale)
emulate-stale: nats build-emulator
./$(BINDIR)/emulator --scenario stale
# Случайные lethal-состояния
emulate-chaos: nats build-emulator
./$(BINDIR)/emulator --scenario chaos
# ============================================================
# Агент сбора метрик (pulse-lets-go-agent)
# ============================================================
build-agent:
@mkdir -p $(BINDIR)
go build -o $(BINDIR)/pulse-lets-go-agent ./cmd/pulse-lets-go-agent
# ============================================================
# SIP-тестер (e2e проверка с FreeSWITCH)
# ============================================================
build-siptest:
@mkdir -p $(BINDIR)
go build -o $(BINDIR)/siptest ./cmd/siptest
# Запуск UAS (PBX-нода, отвечает 200 OK на INVITE)
siptest-uas: build-siptest
./$(BINDIR)/siptest -mode uas
# Отправка тестового звонка (10 CPS, 100 вызовов)
siptest-uac: build-siptest
./$(BINDIR)/siptest -mode uac -r 10 -l 100 -m 100
# Полный e2e тест: UAS + UAC
siptest-full: build-siptest
@echo "→ Запуск UAS (PBX-нода) на порту 5090..."
./$(BINDIR)/siptest -mode uas &
@sleep 1
@echo "→ Запуск UAC (оператор)..."
./$(BINDIR)/siptest -mode uac -r 10 -l 100 -m 200
@echo "→ Остановка UAS..."
pkill siptest 2>/dev/null || true
# ============================================================
# NATS и запуск
# ============================================================
# Запуск NATS-сервера для разработки (в фоне)
nats:
@echo "→ Запуск NATS на порту 4222..."
@if ! pgrep -x nats-server > /dev/null; then \
$(BINDIR)/nats-server -p 4222 -D &>/dev/null & \
disown; \
echo "✓ NATS запущен"; \
else \
echo "NATS уже запущен"; \
fi
# Быстрый старт: NATS + pulse-lets-go
start: nats
@echo "→ Запуск pulse-lets-go..."
$(BINDIR)/$(APP)
# Очистка
clean:
rm -rf $(BINDIR)
cd $(WEB_DIR) && rm -rf build .svelte-kit
# Тесты
test:
go test ./... -v -cover
# Запуск тестов с race detector
test-race:
go test ./... -race -v
# Линтинг
lint:
go vet ./...
# Форматирование
fmt:
go fmt ./...