first commit

This commit is contained in:
Maksim Totmin
2026-06-25 14:27:41 +07:00
commit 44f5fa88e5
44 changed files with 8664 additions and 0 deletions
+142
View File
@@ -0,0 +1,142 @@
# 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
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..."
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
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
# ============================================================
# 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 ./...