pulse-lets-go/Makefile
Maksim Totmin 110289a093 feat: production-grade routing cache + stale detection fixes
Three-tier routing cache (ESL global -> file -> HTTP) eliminates HTTP
from call path for 2500-5000 concurrent calls. Lua reads cached route
in ~0.1us instead of blocking on api:execute('curl', ...).

Engine fixes:
- recalcBestLocked now skips stale nodes (was 5 min bug -> now ~10-15s)
- PickNodeForCall action_type='node' checks staleness for consistency
- onMetric callback pushes cache on every metric (no ticker delay)

Config:
- stale_threshold_sec default 20 -> 10 (industry standard)
- contrib/ included in Makefile deploy target
- route.lua paths updated for /opt/pulse-lets-go
2026-06-25 22:23:16 +07:00

187 lines
6.0 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
PREFIX := /opt/pulse-lets-go
.PHONY: all build build-go build-web clean run test deploy \
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)
# Деплой в PREFIX: бинарник + статика + data + log
deploy: build-prod
@echo "→ Деплой в $(PREFIX)"
install -d $(PREFIX)/bin $(PREFIX)/data $(PREFIX)/web $(PREFIX)/log $(PREFIX)/contrib
install -m 755 $(BINDIR)/$(APP) $(PREFIX)/bin/
cp -r $(WEB_DIR)/build/. $(PREFIX)/web/
cp contrib/*.lua contrib/*.json $(PREFIX)/contrib/ 2>/dev/null || true
@echo "✓ Готово: $(PREFIX)"
@echo " $(PREFIX)/bin/$(APP)"
@echo " $(PREFIX)/web/ (SvelteKit статика)"
@echo " $(PREFIX)/data/ (config.json, trunks.json, users.json)"
@echo " $(PREFIX)/log/ (ASCII-лог метрик)"
@echo " $(PREFIX)/contrib/ (route.lua, конфиги агентов)"
# Установка systemd unit
install-systemd:
install -m 644 deploy/$(APP).service /etc/systemd/system/
systemctl daemon-reload
@echo "✓ systemd unit установлен. Запуск: sudo 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 ./...