# ============================================================================== # VEZA MONOREPO - ULTIMATE CONTROL PLANE # ============================================================================== # Stack: Hybrid (Docker Infra + Bare Metal Apps) # System: Linux / Bash # ============================================================================== # --- Auto-Configuration --- -include .env # Shell setup SHELL := /bin/bash .ONESHELL: .DEFAULT_GOAL := help # --- Variables --- # Ports export PORT_GO ?= 8080 export PORT_CHAT ?= 3000 export PORT_STREAM ?= 3001 export PORT_WEB ?= 5173 # Database & Infra export DB_USER ?= veza export DB_PASS ?= password export DB_NAME ?= veza export DB_HOST ?= localhost export DB_PORT ?= 5432 # Connection Strings export DATABASE_URL = postgres://$(DB_USER):$(DB_PASS)@$(DB_HOST):$(DB_PORT)/$(DB_NAME)?sslmode=disable export REDIS_URL = redis://localhost:6379 export AMQP_URL = amqp://$(DB_USER):$(DB_PASS)@localhost:5672 # Directories DIR_GO := veza-backend-api DIR_CHAT := veza-chat-server DIR_STREAM := veza-stream-server DIR_WEB := apps/web # --- Aesthetics & UI --- # Using echo -e compatible variables BOLD :=  RED :=  GREEN :=  YELLOW :=  BLUE :=  PURPLE :=  CYAN :=  NC :=  # Helper for consistent echoing ECHO_CMD = echo -e # ============================================================================== # 1. HELP & DASHBOARD # ============================================================================== .PHONY: help help: ## Show this dashboard @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}${PURPLE}โšก VEZA MONOREPO CLI โšก${NC}" @$(ECHO_CMD) "----------------------------------------------------------------" @$(ECHO_CMD) "${BOLD}INFRASTRUCTURE:${NC}" @printf " ${CYAN}%-15s${NC} %s\n" "Postgres" "${DATABASE_URL}" @printf " ${CYAN}%-15s${NC} %s\n" "Redis" "${REDIS_URL}" @printf " ${CYAN}%-15s${NC} %s\n" "RabbitMQ" "UI: http://localhost:15672 (veza/password)" @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}AVAILABLE COMMANDS:${NC}" @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " ${YELLOW}%-20s${NC} %s\n", $$1, $$2}' @$(ECHO_CMD) "" # ============================================================================== # 2. SETUP & TOOLS # ============================================================================== .PHONY: setup install-deps install-tools check-tools setup: check-tools install-tools install-deps ## Full project initialization @$(ECHO_CMD) "${BOLD}${GREEN}โœ… Setup Complete! Ready to rock with 'make dev'.${NC}" check-tools: @$(ECHO_CMD) "${BLUE}Checking core requirements...${NC}" @for tool in docker go cargo npm; do \ command -v $$tool >/dev/null 2>&1 || { $(ECHO_CMD) "${RED}โŒ $$tool is missing!${NC}"; exit 1; }; \ done install-deps: ## Install code dependencies @$(ECHO_CMD) "${BLUE}๐Ÿ“ฆ Installing dependencies...${NC}" @$(ECHO_CMD) " -> [Go] Downloading modules..." @(cd $(DIR_GO) && go mod download) @$(ECHO_CMD) " -> [Rust Chat] Fetching crates..." @(cd $(DIR_CHAT) && cargo fetch) @$(ECHO_CMD) " -> [Rust Stream] Fetching crates..." @(cd $(DIR_STREAM) && cargo fetch) @$(ECHO_CMD) " -> [Web] Installing npm packages..." @(cd $(DIR_WEB) && npm install --silent) install-tools: ## Install Power User tools (Hot Reload, Linters) @$(ECHO_CMD) "${BLUE}๐Ÿ› ๏ธ Installing Dev Tools (Hot Reload & Linters)...${NC}" @$(ECHO_CMD) " -> Checking air (Go Hot Reload)..." @command -v air >/dev/null 2>&1 || go install github.com/air-verse/air@latest @$(ECHO_CMD) " -> Checking cargo-watch (Rust Hot Reload)..." @command -v cargo-watch >/dev/null 2>&1 || cargo install cargo-watch @$(ECHO_CMD) " -> Checking sqlx-cli..." @command -v sqlx >/dev/null 2>&1 || cargo install sqlx-cli --no-default-features --features native-tls,postgres @$(ECHO_CMD) "${GREEN}โœ… Tools check done.${NC}" # ============================================================================== # 3. INFRASTRUCTURE & DB # ============================================================================== .PHONY: infra-up infra-down db-shell redis-shell db-migrate status infra-up: ## Start Docker Infra (with health checks) @$(ECHO_CMD) "${BLUE}๐Ÿณ Starting Infrastructure...${NC}" @docker compose up -d @$(MAKE) -s wait-for-infra infra-down: ## Stop Docker Infra @$(ECHO_CMD) "${BLUE}๐Ÿ›‘ Stopping Infrastructure...${NC}" @docker compose down wait-for-infra: @printf "${BLUE}โณ Waiting for services...${NC}" @until docker compose exec -T postgres pg_isready -U $(DB_USER) > /dev/null 2>&1; do printf "."; sleep 1; done @until docker compose exec -T redis redis-cli ping > /dev/null 2>&1; do printf "."; sleep 1; done @$(ECHO_CMD) " ${GREEN}OK${NC}" db-shell: ## Connect to Postgres shell @docker compose exec postgres psql -U $(DB_USER) -d $(DB_NAME) redis-shell: ## Connect to Redis shell @docker compose exec redis redis-cli db-migrate: infra-up ## Run all database migrations @$(ECHO_CMD) "${BLUE}๐Ÿ”„ Running Migrations...${NC}" # Go Backend (Custom tool) @$(ECHO_CMD) " -> [Go] Migrating..." @(cd $(DIR_GO) && go run cmd/migrate_tool/main.go up || $(ECHO_CMD) "${YELLOW}Warning: Go migration failed or tool missing${NC}") # Rust Services (SQLx) @$(ECHO_CMD) " -> [Chat] Migrating..." @(cd $(DIR_CHAT) && sqlx migrate run || $(ECHO_CMD) "${YELLOW}Warning: Chat migration failed (sqlx installed?)${NC}") @$(ECHO_CMD) " -> [Stream] Migrating..." @(cd $(DIR_STREAM) && sqlx migrate run || $(ECHO_CMD) "${YELLOW}Warning: Stream migration failed${NC}") @$(ECHO_CMD) "${GREEN}โœ… Migrations done.${NC}" status: ## Show system health & stats @$(ECHO_CMD) "${BOLD}DOCKER STATS:${NC}" @docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}LOCAL PORTS:${NC}" @lsof -i :$(PORT_GO) -i :$(PORT_CHAT) -i :$(PORT_STREAM) -i :$(PORT_WEB) | grep LISTEN || echo "No apps listening." # ============================================================================== # 4. DEVELOPMENT (SMART MODE) # ============================================================================== .PHONY: dev dev-backend check-ports check-ports: @$(ECHO_CMD) "${BLUE}๐Ÿ” Checking ports...${NC}" @if lsof -i :$(PORT_GO) -t >/dev/null; then $(ECHO_CMD) "${RED}โŒ Port $(PORT_GO) is busy!${NC}"; exit 1; fi @if lsof -i :$(PORT_CHAT) -t >/dev/null; then $(ECHO_CMD) "${RED}โŒ Port $(PORT_CHAT) is busy!${NC}"; exit 1; fi @if lsof -i :$(PORT_STREAM) -t >/dev/null; then $(ECHO_CMD) "${RED}โŒ Port $(PORT_STREAM) is busy!${NC}"; exit 1; fi dev: check-ports infra-up ## Start Everything (Detects Hot Reload tools) @$(ECHO_CMD) "${BOLD}${PURPLE}๐Ÿš€ STARTING HYBRID DEV ENVIRONMENT${NC}" @$(ECHO_CMD) " Go: http://localhost:${PORT_GO}" @$(ECHO_CMD) " Chat: http://localhost:${PORT_CHAT}" @$(ECHO_CMD) " Web: http://localhost:${PORT_WEB}" @$(ECHO_CMD) "${YELLOW}Hit Ctrl+C to stop all.${NC}" @(trap 'kill 0' SIGINT; \ if command -v air >/dev/null; then \ $(ECHO_CMD) "${GREEN}[Go] Hot Reload Active (Air)${NC}" && cd $(DIR_GO) && air & \ else \ $(ECHO_CMD) "${YELLOW}[Go] Standard Run${NC}" && cd $(DIR_GO) && go run cmd/api/main.go & \ fi; \ if command -v cargo-watch >/dev/null; then \ $(ECHO_CMD) "${GREEN}[Chat] Hot Reload Active (Cargo Watch)${NC}" && cd $(DIR_CHAT) && cargo watch -x run -q & \ $(ECHO_CMD) "${GREEN}[Stream] Hot Reload Active (Cargo Watch)${NC}" && cd $(DIR_STREAM) && cargo watch -x run -q & \ else \ $(ECHO_CMD) "${YELLOW}[Chat] Standard Run${NC}" && cd $(DIR_CHAT) && cargo run -q & \ $(ECHO_CMD) "${YELLOW}[Stream] Standard Run${NC}" && cd $(DIR_STREAM) && cargo run -q & \ fi; \ $(ECHO_CMD) "${GREEN}[Web] Starting Vite...${NC}" && cd $(DIR_WEB) && npm run dev & \ wait) dev-backend: check-ports infra-up ## Start Backends Only (Hot Reload supported) @$(ECHO_CMD) "${BOLD}${PURPLE}๐Ÿš€ STARTING BACKEND ONLY${NC}" @(trap 'kill 0' SIGINT; \ if command -v air >/dev/null; then cd $(DIR_GO) && air & else cd $(DIR_GO) && go run cmd/api/main.go & fi; \ if command -v cargo-watch >/dev/null; then cd $(DIR_CHAT) && cargo watch -x run -q & else cd $(DIR_CHAT) && cargo run -q & fi; \ if command -v cargo-watch >/dev/null; then cd $(DIR_STREAM) && cargo watch -x run -q & else cd $(DIR_STREAM) && cargo run -q & fi; \ wait) # ============================================================================== # 5. TEST & QUALITY # ============================================================================== .PHONY: test lint fmt security clean-deep test: infra-up ## Run All Tests (Fastest strategy) @$(ECHO_CMD) "${BLUE}๐Ÿงช Running Tests...${NC}" @$(ECHO_CMD) " [Go] Unit Tests..." @(cd $(DIR_GO) && go test ./... -short) @$(ECHO_CMD) " [Rust] Unit Tests..." @(cd $(DIR_CHAT) && cargo test --lib -q) @(cd $(DIR_STREAM) && cargo test --lib -q) @$(ECHO_CMD) " [Web] Unit Tests..." @(cd $(DIR_WEB) && npm run test -- --run) @$(ECHO_CMD) "${GREEN}โœ… All tests passed.${NC}" lint: ## Lint everything @$(ECHO_CMD) "${BLUE}๐Ÿ” Linting Codebase...${NC}" @(cd $(DIR_CHAT) && cargo clippy -- -D warnings) @(cd $(DIR_STREAM) && cargo clippy -- -D warnings) @(cd $(DIR_GO) && golangci-lint run ./...) @(cd $(DIR_WEB) && npm run lint) fmt: ## Format everything @$(ECHO_CMD) "${BLUE}โœจ Formatting...${NC}" @(cd $(DIR_GO) && go fmt ./...) @(cd $(DIR_CHAT) && cargo fmt) @(cd $(DIR_STREAM) && cargo fmt) @(cd $(DIR_WEB) && npm run format) clean-deep: infra-down ## โš ๏ธ Nuclear Clean (Confirm required) @read -p "Are you sure you want to delete ALL builds and volumes? [y/N] " ans && [ $${ans:-N} = y ] @$(ECHO_CMD) "${RED}โ˜ข๏ธ DESTROYING ARTIFACTS...${NC}" @rm -rf $(DIR_WEB)/node_modules @rm -rf $(DIR_CHAT)/target $(DIR_STREAM)/target @docker compose down -v @$(ECHO_CMD) "${GREEN}System Cleaned.${NC}"