| 1 | # DropHawk - Makefile |
| 2 | # Implements every target listed in CLAUDE.md. |
| 3 | # Requires: docker compose v2, cargo, pnpm, uv |
| 4 | |
| 5 | COMPOSE := docker compose --env-file .env |
| 6 | COMPOSE_ALL := $(COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml |
| 7 | |
| 8 | # ─── Core lifecycle ──────────────────────────────────────────────────────────── |
| 9 | |
| 10 | .PHONY: up |
| 11 | up: ## Bring up all services (dev mode - no resource limits) |
| 12 | $(COMPOSE) up -d |
| 13 | @echo "Services starting. Run 'make health' in ~30s to verify." |
| 14 | |
| 15 | .PHONY: down |
| 16 | down: ## Tear down all services (preserves volumes) |
| 17 | $(COMPOSE) down |
| 18 | |
| 19 | .PHONY: up-prod |
| 20 | up-prod: ## Bring up with homelab prod overrides (resource limits, unless-stopped) |
| 21 | $(COMPOSE_ALL) up -d |
| 22 | |
| 23 | .PHONY: logs |
| 24 | logs: ## Tail logs for all services |
| 25 | $(COMPOSE) logs -f |
| 26 | |
| 27 | .PHONY: logs-% |
| 28 | logs-%: ## Tail logs for a specific service: make logs-backend |
| 29 | $(COMPOSE) logs -f $* |
| 30 | |
| 31 | # ─── Quality gate ────────────────────────────────────────────────────────────── |
| 32 | |
| 33 | .PHONY: check |
| 34 | check: check-backend check-scrapers check-frontend ## Run ALL linters + tests (must pass before merge) |
| 35 | |
| 36 | .PHONY: check-backend |
| 37 | check-backend: ## Rust: clippy + fmt + tests |
| 38 | cd backend && cargo clippy -- -D warnings |
| 39 | cd backend && cargo fmt --check |
| 40 | cd backend && cargo test --all |
| 41 | |
| 42 | .PHONY: check-scrapers |
| 43 | check-scrapers: ## Python: ruff + mypy + pytest |
| 44 | cd scrapers && uv run ruff check . |
| 45 | cd scrapers && uv run ruff format --check . |
| 46 | cd scrapers && uv run mypy . --ignore-missing-imports |
| 47 | cd scrapers && uv run pytest --cov=scrapers --cov-fail-under=75 |
| 48 | |
| 49 | .PHONY: check-frontend |
| 50 | check-frontend: ## TypeScript: tsc + eslint + vitest |
| 51 | cd frontend && pnpm typecheck |
| 52 | cd frontend && pnpm lint |
| 53 | cd frontend && pnpm test |
| 54 | |
| 55 | .PHONY: e2e |
| 56 | e2e: ## Playwright e2e (needs running stack) |
| 57 | cd frontend && pnpm test:e2e |
| 58 | |
| 59 | # ─── Database ────────────────────────────────────────────────────────────────── |
| 60 | |
| 61 | .PHONY: migrate |
| 62 | migrate: ## Run sqlx migrations against $DATABASE_URL |
| 63 | cd backend && cargo sqlx migrate run --database-url "$${DATABASE_URL}" |
| 64 | |
| 65 | .PHONY: seed |
| 66 | seed: ## Apply seed migrations (sources table initial data) |
| 67 | $(COMPOSE) exec -T backend sqlx migrate run --database-url "$${DATABASE_URL}" \ |
| 68 | || cargo sqlx migrate run --database-url "$${DATABASE_URL}" |
| 69 | |
| 70 | .PHONY: psql |
| 71 | psql: ## Open psql shell inside postgres container |
| 72 | $(COMPOSE) exec postgres psql -U $${POSTGRES_USER:-drophawk} -d $${POSTGRES_DB:-drophawk} |
| 73 | |
| 74 | # ─── Cache & messaging ──────────────────────────────────────────────────────── |
| 75 | |
| 76 | .PHONY: redis-cli |
| 77 | redis-cli: ## Open redis-cli inside redis container |
| 78 | $(COMPOSE) exec redis redis-cli -a "$${REDIS_PASSWORD}" |
| 79 | |
| 80 | .PHONY: nats-sub |
| 81 | nats-sub: ## Subscribe to all NATS subjects (requires nats CLI in image) |
| 82 | $(COMPOSE) exec nats nats sub '>' \ |
| 83 | --server nats://localhost:4222 \ |
| 84 | --user "$${NATS_USER:-drophawk}" \ |
| 85 | --password "$${NATS_PASSWORD}" |
| 86 | |
| 87 | # ─── Operations ─────────────────────────────────────────────────────────────── |
| 88 | |
| 89 | .PHONY: health |
| 90 | health: ## Check health of every service |
| 91 | @bash scripts/healthcheck.sh |
| 92 | |
| 93 | .PHONY: backup |
| 94 | backup: ## Run pg_dump backup now |
| 95 | @bash infra/backup/pg-backup.sh |
| 96 | |
| 97 | .PHONY: bench |
| 98 | bench: ## Run Rust benchmarks + Playwright load test |
| 99 | cd backend && cargo bench |
| 100 | cd frontend && pnpm test:e2e |
| 101 | |
| 102 | # ─── Dev helpers ────────────────────────────────────────────────────────────── |
| 103 | |
| 104 | .PHONY: dev |
| 105 | dev: ## Start infra deps only, then start backend + frontend locally |
| 106 | @bash scripts/dev-up.sh |
| 107 | |
| 108 | .PHONY: build |
| 109 | build: ## Build all Docker images |
| 110 | $(COMPOSE) build |
| 111 | |
| 112 | .PHONY: pull |
| 113 | pull: ## Pull latest pinned images |
| 114 | $(COMPOSE) pull |
| 115 | |
| 116 | .PHONY: ps |
| 117 | ps: ## Show container status |
| 118 | $(COMPOSE) ps |
| 119 | |
| 120 | .PHONY: restart-% |
| 121 | restart-%: ## Restart a specific service: make restart-backend |
| 122 | $(COMPOSE) restart $* |
| 123 | |
| 124 | .PHONY: help |
| 125 | help: ## Show this help |
| 126 | @grep -E '^[a-zA-Z_%-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ |
| 127 | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' | sort |
| 128 | |
| 129 | .DEFAULT_GOAL := help |