# 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 ./...