Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
95 lines
3.6 KiB
Makefile
95 lines
3.6 KiB
Makefile
# Load .env if present — exports all variables to sub-processes
|
|
-include .env
|
|
export
|
|
|
|
# Ensure Go and user Go binaries are always on PATH (needed on servers where
|
|
# /etc/profile.d is only sourced for login shells, not by make).
|
|
export PATH := /usr/local/go/bin:$(HOME)/go/bin:$(PATH)
|
|
|
|
.PHONY: install build \
|
|
docker-up docker-down migrate-up migrate-down \
|
|
run-backend run-frontend stop-backend stop-frontend logs-backend logs-frontend \
|
|
dev-backend dev-frontend \
|
|
test test-coverage lint seed
|
|
|
|
## ── Setup ────────────────────────────────────────────────────────────────────
|
|
|
|
# Install all dependencies: Go CLI tools, Go modules, Node packages.
|
|
install:
|
|
go install github.com/pressly/goose/v3/cmd/goose@latest
|
|
go install github.com/air-verse/air@latest
|
|
cd backend && go mod download
|
|
cd frontend && npm ci
|
|
|
|
# Build the Go binary and the Next.js production bundle.
|
|
build:
|
|
mkdir -p backend/bin
|
|
cd backend && go build -o bin/api ./cmd/api
|
|
cd frontend && npm run build
|
|
|
|
## ── Infrastructure ───────────────────────────────────────────────────────────
|
|
|
|
docker-up:
|
|
docker compose up -d postgres redis
|
|
|
|
docker-down:
|
|
docker compose down
|
|
|
|
migrate-up:
|
|
goose -dir migrations postgres "$(DATABASE_URL)" up
|
|
|
|
migrate-down:
|
|
goose -dir migrations postgres "$(DATABASE_URL)" down
|
|
|
|
## ── Production servers (require `make build` first) ─────────────────────────
|
|
|
|
run-backend:
|
|
mkdir -p logs
|
|
nohup backend/bin/api > logs/backend.log 2>&1 & echo $$! > logs/backend.pid
|
|
@echo "Backend started (pid $$(cat logs/backend.pid)) — logs/backend.log"
|
|
|
|
run-frontend:
|
|
mkdir -p logs
|
|
nohup sh -c 'cd frontend && env -u PORT npx next start -p 3001' > logs/frontend.log 2>&1 & echo $$! > logs/frontend.pid
|
|
@echo "Frontend started (pid $$(cat logs/frontend.pid)) — logs/frontend.log"
|
|
|
|
stop-backend:
|
|
@[ -f logs/backend.pid ] && kill $$(cat logs/backend.pid) && rm logs/backend.pid && echo "Backend stopped" || echo "Backend not running"
|
|
|
|
stop-frontend:
|
|
@[ -f logs/frontend.pid ] && kill $$(cat logs/frontend.pid) && rm logs/frontend.pid && echo "Frontend stopped" || echo "Frontend not running"
|
|
|
|
logs-backend:
|
|
tail -f logs/backend.log
|
|
|
|
logs-frontend:
|
|
tail -f logs/frontend.log
|
|
|
|
## ── Development servers (hot reload) ────────────────────────────────────────
|
|
|
|
dev-backend:
|
|
cd backend && air
|
|
|
|
dev-frontend:
|
|
cd frontend && env -u PORT npm run dev
|
|
|
|
## ── Testing ──────────────────────────────────────────────────────────────────
|
|
|
|
test:
|
|
cd backend && go test ./... && cd ../frontend && npm test -- --passWithNoTests
|
|
|
|
test-coverage:
|
|
cd backend && go test -coverprofile=coverage.out ./... && go tool cover -html=coverage.out -o coverage.html
|
|
@echo "Coverage report: backend/coverage.html"
|
|
|
|
## ── Dev seed (local DB only — never run against production) ──────────────────
|
|
|
|
seed:
|
|
cd backend && go run ./cmd/seed
|
|
|
|
## ── Linting ──────────────────────────────────────────────────────────────────
|
|
|
|
lint:
|
|
cd backend && golangci-lint run ./...
|
|
cd frontend && npx tsc --noEmit && npx eslint .
|