Files
EventHubBack/Makefile

389 lines
16 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.
.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