Single prefix deployment: /opt/pulse-lets-go/ contains bin/, data/, web/, log/ — no more split across /usr/local/bin, /etc, /usr/local/share, /var/log. * Makefile: install → deploy target with PREFIX=/opt/pulse-lets-go * deploy/pulse-lets-go.service: all paths under /opt/pulse-lets-go, removed stale nats.service dependency * main.go: default dataDir = parent of exeDir (PREFIX/bin → PREFIX/data) * README: updated all paths, step 1 uses make deploy
185 lines
5.8 KiB
Makefile
185 lines
5.8 KiB
Makefile
# 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
|
||
install -m 755 $(BINDIR)/$(APP) $(PREFIX)/bin/
|
||
cp -r $(WEB_DIR)/build/. $(PREFIX)/web/
|
||
@echo "✓ Готово: $(PREFIX)"
|
||
@echo " $(PREFIX)/bin/$(APP)"
|
||
@echo " $(PREFIX)/web/ (SvelteKit статика)"
|
||
@echo " $(PREFIX)/data/ (config.json, trunks.json, users.json)"
|
||
@echo " $(PREFIX)/log/ (ASCII-лог метрик)"
|
||
|
||
# Установка 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 ./...
|