389 lines
16 KiB
Makefile
389 lines
16 KiB
Makefile
.PHONY: help clean compile shell test eunit test-api test-all \
|
||
dialyzer xref cover docs release run stop logs
|
||
|
||
# Цвета для вывода (только для команд, где нужны)
|
||
GREEN := \033[0;32m
|
||
YELLOW := \033[1;33m
|
||
RED := \033[0;31m
|
||
BLUE := \033[0;34m
|
||
NC := \033[0m
|
||
|
||
# Переменные
|
||
REBAR3 := rebar3
|
||
SNAME := eventhub
|
||
SHELL := /bin/bash
|
||
|
||
# ============================================================================
|
||
# HELP
|
||
# ============================================================================
|
||
help: ## Показать это сообщение
|
||
@echo "EventHub - Makefile команды:"
|
||
@echo ""
|
||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
||
awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'
|
||
|
||
# ============================================================================
|
||
# BUILD
|
||
# ============================================================================
|
||
compile: ## Скомпилировать проект
|
||
@echo "Компиляция проекта..."
|
||
@$(REBAR3) compile
|
||
@echo "✓ Компиляция завершена"
|
||
|
||
clean: ## Очистить проект
|
||
@echo "Очистка проекта..."
|
||
@$(REBAR3) clean
|
||
#@rm -rf _build build/ct_run.* deps logs *.log
|
||
@rm -rf build/ct_run.* deps logs *.log
|
||
@echo "✓ Очистка завершена"
|
||
|
||
deps: ## Установить зависимости
|
||
@echo "Установка зависимостей..."
|
||
@$(REBAR3) get-deps
|
||
@echo "✓ Зависимости установлены"
|
||
|
||
update-deps: ## Обновить зависимости
|
||
@echo "Обновление зависимостей..."
|
||
@$(REBAR3) update-deps
|
||
@echo "✓ Зависимости обновлены"
|
||
|
||
# ============================================================================
|
||
# DEVELOPMENT
|
||
# ============================================================================
|
||
shell: ## Запустить интерактивную оболочку
|
||
@echo "Запуск Erlang shell..."
|
||
@$(REBAR3) shell --sname $(SNAME)
|
||
|
||
run: ## Запустить приложение (foreground)
|
||
@echo "Запуск приложения..."
|
||
@$(REBAR3) shell --sname $(SNAME)
|
||
|
||
test-server: ## Запустить тестовый сервер в фоне
|
||
@echo "Cleaning old data..."
|
||
@rm -rf Mnesia.*
|
||
@echo "Starting server..."
|
||
@$(REBAR3) shell --sname eventhub_test </dev/null > /tmp/eventhub_test.log 2>&1 &
|
||
@echo "PID: $$!"
|
||
@for i in 1 2 3 4 5 6 7 8 9 10; do \
|
||
if curl -s http://localhost:8080/health | grep -q "ok"; then \
|
||
echo "✓ Server ready at http://localhost:8080"; \
|
||
break; \
|
||
fi; \
|
||
sleep 1; \
|
||
done
|
||
|
||
stop: ## Остановить приложение
|
||
@echo "Остановка приложения..."
|
||
@pkill -f "rebar3 shell --sname $(SNAME)" || true
|
||
@pkill -f "beam.*$(SNAME)" || true
|
||
@pkill -f beam.smp || true
|
||
@echo "✓ Приложение остановлено"
|
||
|
||
restart: stop run ## Перезапустить приложение
|
||
|
||
# ============================================================================
|
||
# TESTING
|
||
# ============================================================================
|
||
test: eunit ## Запустить все тесты (алиас для eunit)
|
||
|
||
eunit: ## Запустить EUnit тесты
|
||
@echo "Запуск EUnit тестов..."
|
||
@$(REBAR3) eunit --sname $(SNAME)_test --verbose
|
||
|
||
eunit-module: ## Запустить тесты для модуля (make eunit-module MODULE=core_calendar_tests)
|
||
@echo "Запуск тестов для модуля $(MODULE)..."
|
||
@$(REBAR3) eunit --sname $(SNAME)_test --module=$(MODULE) --verbose
|
||
|
||
eunit-verbose: ## Запустить EUnit тесты с подробным выводом
|
||
@echo "Запуск EUnit тестов (verbose)..."
|
||
@$(REBAR3) eunit --sname $(SNAME)_test --verbose
|
||
|
||
test-api: test-ct
|
||
|
||
test-ct: ## Запустить Common Test для API
|
||
@echo "Cleaning old data..."
|
||
@rm -rf Mnesia.*
|
||
@rm -rf logs/test/ct/ct_run.*
|
||
@$(REBAR3) ct --sname $(SNAME)_api_test
|
||
|
||
test-ct-verbose: ## Запустить Common Test с подробным выводом
|
||
@ct_run -suite test/api_SUITE \
|
||
-pa _build/default/lib/*/ebin \
|
||
-pa test/api \
|
||
-logdir build \
|
||
-verbosity 50
|
||
|
||
test-remote:
|
||
@CT_MODE=remote API_HOST=http://localhost:8080 ADMIN_API_HOST=http://localhost:8445 rebar3 ct
|
||
|
||
test-remote-cluster:
|
||
@rm -rf logs/test/ct/ct_run.*
|
||
@CT_MODE=remote \
|
||
API_HOST=https://api.eventhub.local/api \
|
||
WS_HOST=wss://ws.eventhub.local \
|
||
ADMIN_API_HOST=https://admin-api.eventhub.local/api \
|
||
ADMIN_WS_HOST=wss://admin-ws.eventhub.local \
|
||
rebar3 ct
|
||
|
||
test-api-docker:
|
||
@docker build -t eventhub-tests -f docker/ApiTests.Dockerfile .
|
||
@docker run --rm \
|
||
-e CT_MODE=remote \
|
||
-e "API_HOST=http://eventhub:8080" \
|
||
-e "ADMIN_API_HOST=http://eventhub:8445" \
|
||
-e "WS_HOST=ws://eventhub:8081" \
|
||
-e "ADMIN_WS_HOST=ws://eventhub:8446" \
|
||
eventhub-tests
|
||
|
||
test-scripts: ## Запустить тесты с фильтром (make test-runner PATTERN=booking)
|
||
@chmod +x test/scripts/*.sh
|
||
@cd test/scripts && ./run_tests.sh $(PATTERN)
|
||
|
||
test-all: eunit test-api ## Запустить ВСЕ тесты (EUnit + API)
|
||
@echo "========================================"
|
||
@echo " ВСЕ ТЕСТЫ ПРОЙДЕНЫ!"
|
||
@echo "========================================"
|
||
|
||
# ============================================================================
|
||
# LOAD TESTING
|
||
# ============================================================================
|
||
tsung-test: ## Запустить нагрузочный тест Tsung
|
||
@echo "Запуск нагрузочного теста Tsung..."
|
||
@mkdir -p logs/tsung
|
||
@tsung -f test/tsung/eventhub_http.xml -l logs/tsung start
|
||
@echo "Отчёт: logs/tsung/*/report.html"
|
||
|
||
wrk-register: ## Нагрузочный тест регистрации (wrk2)
|
||
@wrk -t4 -c100 -d30s -t100 -s test/wrk/scripts/wrk_register.lua https://api.eventhub.local/api/v1/register
|
||
|
||
wrk-search: ## Нагрузочный тест поиска (wrk2)
|
||
@TOKEN=$$(curl -s -X POST https://api.eventhub.local/api/v1/register \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"email":"wrktest@test.com","password":"pass"}' | \
|
||
grep -o '"token":"[^"]*"' | cut -d'"' -f4); \
|
||
wrk -t4 -c100 -d30s -t200 \
|
||
-H "Authorization: Bearer $$TOKEN" \
|
||
https://api.eventhub.local/api/v1/search?type=event\&q=test
|
||
|
||
curl-health:
|
||
for i in {1..2}; do curl -k -s -o /dev/null -w "%{http_code}\n" -H "Host: api.eventhub.local" https://localhost/api/health; done
|
||
|
||
wrk-health: ## Нагрузочный тест health (wrk2)
|
||
wrk -t4 -c100 -d30s -t100 \
|
||
-H "Host: api.eventhub.local" \
|
||
https://api.eventhub.local/api/health
|
||
|
||
# ============================================================================
|
||
# CODE QUALITY
|
||
# ============================================================================
|
||
dialyzer: ## Запустить Dialyzer (статический анализ)
|
||
@echo "Запуск Dialyzer..."
|
||
@$(REBAR3) dialyzer
|
||
@echo "✓ Dialyzer завершён"
|
||
|
||
xref: ## Запустить Xref (кросс-ссылки)
|
||
@echo "Запуск Xref..."
|
||
@$(REBAR3) xref
|
||
@echo "✓ Xref завершён"
|
||
|
||
cover: ## Запустить тесты с покрытием кода
|
||
@echo "Запуск тестов с покрытием..."
|
||
@$(REBAR3) eunit --sname $(SNAME)_test --cover
|
||
@$(REBAR3) cover --verbose
|
||
@echo "✓ Отчёт о покрытии в _build/test/cover/"
|
||
|
||
docs: ## Сгенерировать документацию (EDoc)
|
||
@echo "Генерация документации..."
|
||
@$(REBAR3) edoc
|
||
@echo "✓ Документация в doc/"
|
||
|
||
# ============================================================================
|
||
# RELEASE & DOCKER
|
||
# ============================================================================
|
||
release: ## Собрать релиз
|
||
@echo "Сборка релиза..."
|
||
@$(REBAR3) as prod release
|
||
@echo "✓ Релиз собран в _build/prod/rel/eventhub/"
|
||
|
||
# ============================================================================
|
||
# DOCKER
|
||
# ============================================================================
|
||
docker-build: ## Собрать Docker образ
|
||
@echo "Сборка Docker образа..."
|
||
@docker build -f docker/Dockerfile -t eventhub:latest .
|
||
@echo "✅ Docker образ собран"
|
||
|
||
docker-build-debug: ## Собрать Docker образ
|
||
@echo "Сборка Docker образа..."
|
||
@docker build -f docker/Debug.Dockerfile -t eventhub-debug:latest .
|
||
@echo "✅ Docker образ собран"
|
||
|
||
|
||
docker-run: ## Запустить Docker контейнер (одиночный)
|
||
@echo "Запуск Docker контейнера..."
|
||
@docker run -d \
|
||
--hostname eventhub.local \
|
||
--env-file docker/.env \
|
||
--name eventhub \
|
||
-e NODE_NAME=eventhub@eventhub.local \
|
||
-p 8080:8080 \
|
||
-p 8081:8081 \
|
||
-p 8445:8445 \
|
||
-p 8446:8446 \
|
||
-v eventhub-data:/app/data \
|
||
eventhub:latest
|
||
@echo "✅ Контейнер запущен на http://localhost:8080"
|
||
|
||
docker-stop: ## Остановить Docker контейнер
|
||
@echo "Остановка Docker контейнера..."
|
||
@docker stop eventhub 2>/dev/null || true
|
||
@docker rm eventhub 2>/dev/null || true
|
||
@echo "✅ Контейнер остановлен"
|
||
|
||
docker-logs: ## Показать логи Docker контейнера
|
||
@docker logs -f eventhub
|
||
|
||
docker-shell: ## Зайти в Docker контейнер
|
||
@docker exec -it eventhub sh
|
||
|
||
docker-compose-build-app: ## Собрать Docker образ
|
||
@echo "Сборка Docker образа..."
|
||
@docker-compose -f docker/docker-compose.yml build --no-cache eventhub-node1 eventhub-node2 eventhub-node3
|
||
@echo "✅ Docker образ собран"
|
||
|
||
docker-compose-up: ## Запустить кластер (3 ноды)
|
||
@echo "Запуск кластера EventHub (3 ноды)..."
|
||
@docker-compose -f docker/docker-compose.yml --env-file docker/.env up -d
|
||
@echo "✅ Кластер запущен"
|
||
@echo "Node 1: http://localhost:8080"
|
||
@echo "Node 2: http://localhost:8082"
|
||
@echo "Node 3: http://localhost:8084"
|
||
@echo "Prometheus: http://localhost:9090"
|
||
@echo "Grafana: http://localhost:3000"
|
||
@echo "ObserverWeb: http://localhost:4000/observer/"
|
||
@echo "Traefik: http://localhost:8080"
|
||
@echo "LogLynx: http://localhost:6123"
|
||
|
||
docker-compose-down: ## Остановить кластер
|
||
@echo "Остановка кластера..."
|
||
@docker-compose -f docker/docker-compose.yml --env-file docker/.env down
|
||
@echo "✅ Кластер остановлен"
|
||
|
||
docker-compose-logs: ## Показать логи кластера
|
||
@docker-compose -f docker/docker-compose.yml --env-file docker/.env logs -f
|
||
|
||
docker-clean: docker-stop ## Очистить Docker образы и volumes
|
||
@docker rmi eventhub:latest 2>/dev/null || true
|
||
@docker volume rm eventhub-data 2>/dev/null || true
|
||
@echo "✅ Docker очищен"
|
||
|
||
docker-swarm-deploy: ## Запустить кластер
|
||
@set RELEASE_COOKIE=$$(grep RELEASE_COOKIE docker/.env | cut -d '=' -f2)
|
||
@set JWT_SECRET=$$(grep JWT_SECRET docker/.env | cut -d '=' -f2)
|
||
@docker stack deploy -c docker/docker-compose.swarm.yml eventhub --detach=true
|
||
@echo "✅ Кластер запущен"
|
||
|
||
docker-swarm-stop: ## Запустить кластер
|
||
@docker stack rm eventhub
|
||
@docker volume prune -f
|
||
@echo "✅ Кластер удален"
|
||
|
||
docker-swarm-scale: ## Изменить количество реплик (например, make scale REPLICAS=5)
|
||
@echo "Масштабирование до ${REPLICAS} реплик..."
|
||
docker service scale eventhub_eventhub=${REPLICAS}
|
||
@echo "✅ Сервис масштабирован"
|
||
|
||
docker-swarm-status: ## Показать состояние кластера
|
||
@echo "Количество узлов в кластере:"
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'length(nodes()).'
|
||
@echo "Список узлов:"
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'nodes().'
|
||
@echo "Список узлов Mnesia:"
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'mnesia:table_info(user, disc_copies).'
|
||
|
||
docker-swarm-reg-admin:
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'core_admin:create(<<"admin">>,<<"123456">>,superadmin).'
|
||
|
||
docker-swarm-check-admin:
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'eventhub_auth:authenticate_admin_request(<<"">>,<<"admin@eventhub.local">>,<<"123456">>).'
|
||
|
||
docker-swarm-reg-bots:
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval "os:putenv(\"BOT_COUNT\", \"3000\"), bot_controller:register()."
|
||
|
||
docker-swarm-reg-bots-stop:
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'bot_controller:stop().'
|
||
|
||
docker-swarm-delete-bots:
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'bot_controller:delete().'
|
||
|
||
docker-swarm-count-bots:
|
||
@for id in $$(docker ps -qf "name=eventhub_eventhub"); do \
|
||
echo "=== $$id ==="; \
|
||
docker exec $$id /app/bin/eventhub eval 'bot_controller:count_bots().'; \
|
||
done
|
||
|
||
docker-swarm-shell:
|
||
@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub remote_console
|
||
|
||
|
||
# ============================================================================
|
||
# UTILITIES
|
||
# ============================================================================
|
||
status: ## Проверить статус сервера
|
||
@echo "Проверка статуса сервера..."
|
||
@if curl -s http://localhost:8080/health > /dev/null 2>&1; then \
|
||
echo "✓ Сервер запущен на http://localhost:8080"; \
|
||
curl -s http://localhost:8080/health; \
|
||
else \
|
||
echo "✗ Сервер не запущен"; \
|
||
fi
|
||
|
||
tree: ## Показать структуру проекта
|
||
@tree -I '_build|deps|logs|.git' --dirsfirst 2>/dev/null || ls -la
|
||
|
||
info: ## Показать информацию о проекте
|
||
@echo "EventHub - информация о проекте:"
|
||
@echo ""
|
||
@echo "API эндпоинты:"
|
||
@echo " POST /v1/register - Регистрация"
|
||
@echo " POST /v1/login - Логин"
|
||
@echo " POST /v1/refresh - Обновление токена"
|
||
@echo " GET /v1/user/me - Профиль"
|
||
@echo " POST /v1/calendars - Создание календаря"
|
||
@echo " GET /v1/calendars - Список календарей"
|
||
@echo " POST /v1/calendars/:id/events - Создание события"
|
||
@echo " POST /v1/events/:id/bookings - Запись на событие"
|
||
@echo ""
|
||
@echo "Порты:"
|
||
@echo " HTTP API: 8080"
|
||
@echo " Admin HTTP: 8445"
|
||
|
||
# ============================================================================
|
||
# DEVELOPMENT WORKFLOW
|
||
# ============================================================================
|
||
dev-setup: deps compile ## Настроить окружение для разработки
|
||
@echo "✓ Окружение настроено"
|
||
|
||
dev-test: ## Быстрый цикл: compile + eunit
|
||
@make compile
|
||
@make eunit
|
||
|
||
# ============================================================================
|
||
# GIT HELPERS
|
||
# ============================================================================
|
||
git-status: ## Показать статус Git
|
||
@git status --short
|
||
|
||
git-log: ## Показать лог Git (последние 10)
|
||
@git log --oneline -10
|
||
|
||
git-save: ## Сохранить изменения (commit + push)
|
||
@read -p "Сообщение коммита: " msg; \
|
||
git add .; \
|
||
git commit -m "$$msg"; \
|
||
git push
|
||
|
||
# ============================================================================
|
||
# DEFAULT
|
||
# ============================================================================
|
||
.DEFAULT_GOAL := help
|