-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
364 lines (302 loc) Β· 13.8 KB
/
Makefile
File metadata and controls
364 lines (302 loc) Β· 13.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
.PHONY: help build build-docker run run-docker run-compose stop stop-compose logs logs-compose test test-docker clean clean-docker clean-all push pull release version info
# Variables
PROJECT_NAME := reverse-proxy
BINARY_NAME := proxy
IMAGE_NAME := reverse-proxy
IMAGE_TAG := latest
CONTAINER_NAME := reverse-proxy
PORT := 9000
REGISTRY := docker.io
USERNAME := $(shell whoami)
GO_VERSION := 1.24.2
GO_FLAGS := -v
GO_BUILD_FLAGS := -a -installsuffix cgo
# Colors
YELLOW := \033[0;33m
GREEN := \033[0;32m
BLUE := \033[0;34m
RED := \033[0;31m
NC := \033[0m # No Color
# Paths
BIN_DIR := bin
DOCKER_DIR := .
CONFIG_FILE := configs/config.yaml
DOCKER_IMAGE := $(IMAGE_NAME):$(IMAGE_TAG)
# Default target
.DEFAULT_GOAL := help
##@ General
help: ## Display this help screen
@echo "$(BLUE)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ$(NC)"
@echo "$(BLUE)β Reverse Proxy Makefile - Build & Deploy β$(NC)"
@echo "$(BLUE)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ$(NC)"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(YELLOW)%-20s$(NC) %s\n", $$1, $$2}'
@echo ""
@echo "$(BLUE)Quick Start:$(NC)"
@echo " make build # Build standalone binary"
@echo " make run # Run standalone binary"
@echo " make build-docker # Build Docker image"
@echo " make run-docker # Run Docker container"
@echo " make run-compose # Run with Docker Compose"
@echo ""
@echo "$(BLUE)Testing & Validation:$(NC)"
@echo " make test # Run unit tests"
@echo " make test-docker # Test Docker container"
@echo " make coverage # Generate coverage report"
@echo ""
version: ## Show project version and Go version
@echo "$(GREEN)Project:$(NC) $(PROJECT_NAME)"
@echo "$(GREEN)Binary:$(NC) $(BINARY_NAME)"
@echo "$(GREEN)Image:$(NC) $(DOCKER_IMAGE)"
@echo "$(GREEN)Go Version:$(NC) $(GO_VERSION)"
@go version
##@ Building
build: ## Build standalone binary
@echo "$(YELLOW)π¨ Building $(BINARY_NAME) binary...$(NC)"
@mkdir -p $(BIN_DIR)
@CGO_ENABLED=0 go build $(GO_FLAGS) -o $(BIN_DIR)/$(BINARY_NAME) ./cmd/proxy
@echo "$(GREEN)β Binary built: $(BIN_DIR)/$(BINARY_NAME)$(NC)"
@ls -lh $(BIN_DIR)/$(BINARY_NAME)
build-no-cgo: ## Build binary with CGO enabled (for local development)
@echo "$(YELLOW)π¨ Building $(BINARY_NAME) (with CGO)...$(NC)"
@mkdir -p $(BIN_DIR)
@go build $(GO_FLAGS) -o $(BIN_DIR)/$(BINARY_NAME) ./cmd/proxy
@echo "$(GREEN)β Binary built: $(BIN_DIR)/$(BINARY_NAME)$(NC)"
build-docker: ## Build Docker image
@echo "$(YELLOW)π³ Building Docker image: $(DOCKER_IMAGE)...$(NC)"
@docker build -t $(DOCKER_IMAGE) -f $(DOCKER_DIR)/Dockerfile .
@echo "$(GREEN)β Docker image built$(NC)"
@docker images | grep $(IMAGE_NAME)
build-docker-nocache: ## Build Docker image without cache
@echo "$(YELLOW)π³ Building Docker image (no-cache): $(DOCKER_IMAGE)...$(NC)"
@docker build --no-cache -t $(DOCKER_IMAGE) -f $(DOCKER_DIR)/Dockerfile .
@echo "$(GREEN)β Docker image built$(NC)"
##@ Running
run: build ## Build and run standalone binary
@echo "$(YELLOW)βΆοΈ Running $(BINARY_NAME)...$(NC)"
@./$(BIN_DIR)/$(BINARY_NAME) -config $(CONFIG_FILE)
run-docker: build-docker ## Build and run Docker container
@echo "$(YELLOW)βΆοΈ Running Docker container: $(CONTAINER_NAME)...$(NC)"
@if docker ps | grep -q $(CONTAINER_NAME); then \
echo "$(RED)β Container already running. Stopping existing container...$(NC)"; \
docker stop $(CONTAINER_NAME) && docker rm $(CONTAINER_NAME); \
fi
@docker run -d \
--name $(CONTAINER_NAME) \
-p $(PORT):9000 \
-v $$(pwd)/$(CONFIG_FILE):/etc/proxy/config/config.yaml:ro \
-v $$(pwd)/examples:/etc/proxy/examples:ro \
--restart unless-stopped \
$(DOCKER_IMAGE)
@echo "$(GREEN)β Container started: $(CONTAINER_NAME)$(NC)"
@echo "$(BLUE) Port:$(NC) http://localhost:$(PORT)"
@echo "$(BLUE) Logs:$(NC) make logs-docker"
@docker ps | grep $(CONTAINER_NAME)
run-compose: ## Start all services with Docker Compose
@echo "$(YELLOW)βΆοΈ Starting services with Docker Compose...$(NC)"
@docker-compose up -d
@echo "$(GREEN)β Services started$(NC)"
@docker-compose ps
run-compose-build: ## Build and start with Docker Compose
@echo "$(YELLOW)βΆοΈ Building and starting services...$(NC)"
@docker-compose up -d --build
@echo "$(GREEN)β Services started$(NC)"
@docker-compose ps
run-interactive: ## Run Docker container in interactive mode
@echo "$(YELLOW)βΆοΈ Running Docker container (interactive)...$(NC)"
@docker run -it --rm \
-p $(PORT):9000 \
-v $$(pwd)/$(CONFIG_FILE):/etc/proxy/config/config.yaml:ro \
-v $$(pwd)/examples:/etc/proxy/examples:ro \
$(DOCKER_IMAGE)
##@ Stopping & Cleanup
stop: ## Stop standalone binary (if running)
@pkill -f "$(BIN_DIR)/$(BINARY_NAME)" || echo "$(YELLOW)β No process running$(NC)"
@echo "$(GREEN)β Stopped$(NC)"
stop-docker: ## Stop Docker container
@echo "$(YELLOW)βΉοΈ Stopping container: $(CONTAINER_NAME)...$(NC)"
@docker stop $(CONTAINER_NAME) 2>/dev/null || echo "$(YELLOW)β Container not running$(NC)"
@docker rm $(CONTAINER_NAME) 2>/dev/null || true
@echo "$(GREEN)β Container stopped$(NC)"
stop-compose: ## Stop Docker Compose services
@echo "$(YELLOW)βΉοΈ Stopping services...$(NC)"
@docker-compose down
@echo "$(GREEN)β Services stopped$(NC)"
clean: ## Clean build artifacts
@echo "$(YELLOW)π§Ή Cleaning build artifacts...$(NC)"
@rm -rf $(BIN_DIR)
@rm -f coverage.out
@echo "$(GREEN)β Cleaned$(NC)"
clean-docker: ## Remove Docker image and containers
@echo "$(YELLOW)π§Ή Removing Docker resources...$(NC)"
@docker stop $(CONTAINER_NAME) 2>/dev/null || true
@docker rm $(CONTAINER_NAME) 2>/dev/null || true
@docker rmi $(DOCKER_IMAGE) 2>/dev/null || echo "$(YELLOW)β Image not found$(NC)"
@echo "$(GREEN)β Docker resources cleaned$(NC)"
clean-compose: ## Stop and remove Docker Compose services
@echo "$(YELLOW)π§Ή Stopping Docker Compose services...$(NC)"
@docker-compose down --rmi local -v
@echo "$(GREEN)β Docker Compose services cleaned$(NC)"
clean-all: clean clean-docker ## Clean all artifacts and Docker resources
@echo "$(GREEN)β All cleaned$(NC)"
##@ Testing
test: ## Run unit tests
@echo "$(YELLOW)π§ͺ Running unit tests...$(NC)"
@go test -v ./...
@echo "$(GREEN)β Tests completed$(NC)"
test-verbose: ## Run unit tests with verbose output
@echo "$(YELLOW)π§ͺ Running unit tests (verbose)...$(NC)"
@go test -vv ./...
test-coverage: coverage ## Run tests with coverage (alias)
coverage: ## Generate coverage report
@echo "$(YELLOW)π Generating coverage report...$(NC)"
@go test -coverprofile=coverage.out ./...
@go tool cover -html=coverage.out -o coverage.html
@echo "$(GREEN)β Coverage report generated$(NC)"
@echo " HTML Report: $(YELLOW)coverage.html$(NC)"
@go test -cover ./... | grep coverage:
@echo "$(BLUE) Open in browser: open coverage.html$(NC)"
test-docker: run-docker ## Test Docker container health and endpoints
@echo "$(YELLOW)π§ͺ Testing Docker container...$(NC)"
@sleep 3
@echo "$(BLUE)Testing health endpoint...$(NC)"
@curl -s http://localhost:$(PORT)/health > /dev/null && echo "$(GREEN)β Health check passed$(NC)" || echo "$(RED)β Health check failed$(NC)"
@echo ""
@echo "$(BLUE)Testing basic GET request...$(NC)"
@curl -s -X GET http://localhost:$(PORT)/get | head -c 100 && echo "" && echo "$(GREEN)β GET request passed$(NC)"
@echo ""
@echo "$(BLUE)Testing POST request...$(NC)"
@curl -s -X POST -H "Content-Type: application/json" -d '{"test":"data"}' http://localhost:$(PORT)/post | head -c 100 && echo "" && echo "$(GREEN)β POST request passed$(NC)"
@echo ""
@echo "$(BLUE)Testing CORS preflight...$(NC)"
@curl -s -X OPTIONS -H "Origin: http://localhost:3000" http://localhost:$(PORT)/get > /dev/null && echo "$(GREEN)β CORS preflight passed$(NC)"
bench: ## Run benchmarks
@echo "$(YELLOW)β‘ Running benchmarks...$(NC)"
@go test -bench=. -benchmem ./...
##@ Logging & Monitoring
logs: ## View standalone binary logs (requires process manager)
@tail -f /tmp/$(PROJECT_NAME).log 2>/dev/null || echo "$(YELLOW)β No logs available$(NC)"
logs-docker: ## View Docker container logs
@echo "$(YELLOW)π Container logs ($(CONTAINER_NAME))...$(NC)"
@docker logs -f $(CONTAINER_NAME)
logs-compose: ## View Docker Compose logs
@echo "$(YELLOW)π Docker Compose logs...$(NC)"
@docker-compose logs -f
logs-compose-proxy: ## View Docker Compose proxy service logs
@docker-compose logs -f reverse-proxy
logs-compose-backend: ## View Docker Compose backend logs
@docker-compose logs -f backend-api-1 backend-api-2
stats: ## Show Docker container statistics
@echo "$(YELLOW)π Container statistics...$(NC)"
@docker stats $(CONTAINER_NAME) --no-stream
ps: ## List running containers
@echo "$(YELLOW)π¦ Running containers...$(NC)"
@docker ps | grep -E "CONTAINER|$(IMAGE_NAME)" || echo "$(YELLOW)β No containers running$(NC)"
ps-compose: ## List Docker Compose services status
@echo "$(YELLOW)π¦ Docker Compose services...$(NC)"
@docker-compose ps
##@ Docker Registry
push: ## Push Docker image to registry
@echo "$(YELLOW)π€ Pushing image to registry...$(NC)"
@docker tag $(DOCKER_IMAGE) $(REGISTRY)/$(USERNAME)/$(DOCKER_IMAGE)
@docker push $(REGISTRY)/$(USERNAME)/$(DOCKER_IMAGE)
@echo "$(GREEN)β Image pushed$(NC)"
pull: ## Pull Docker image from registry
@echo "$(YELLOW)π₯ Pulling image from registry...$(NC)"
@docker pull $(REGISTRY)/$(USERNAME)/$(DOCKER_IMAGE)
@echo "$(GREEN)β Image pulled$(NC)"
release: build build-docker ## Create a release build
@echo "$(YELLOW)π― Creating release...$(NC)"
@echo "$(GREEN)β Release build complete$(NC)"
@echo " Binary: $(BIN_DIR)/$(BINARY_NAME)"
@echo " Docker: $(DOCKER_IMAGE)"
##@ Development
fmt: ## Format Go code
@echo "$(YELLOW)π¨ Formatting Go code...$(NC)"
@go fmt ./...
@echo "$(GREEN)β Code formatted$(NC)"
vet: ## Run go vet
@echo "$(YELLOW)π Running go vet...$(NC)"
@go vet ./...
@echo "$(GREEN)β No vet issues found$(NC)"
lint: ## Run linter (requires golangci-lint)
@command -v golangci-lint >/dev/null 2>&1 || (echo "$(RED)β golangci-lint not installed$(NC)" && exit 1)
@echo "$(YELLOW)π Running linter...$(NC)"
@golangci-lint run ./...
@echo "$(GREEN)β Linting complete$(NC)"
deps: ## Download dependencies
@echo "$(YELLOW)π¦ Downloading dependencies...$(NC)"
@go mod download
@go mod verify
@echo "$(GREEN)β Dependencies downloaded$(NC)"
tidy: ## Tidy dependencies
@echo "$(YELLOW)π§Ή Tidying dependencies...$(NC)"
@go mod tidy
@echo "$(GREEN)β Dependencies tidied$(NC)"
vendor: ## Vendor dependencies
@echo "$(YELLOW)π¦ Vendoring dependencies...$(NC)"
@go mod vendor
@echo "$(GREEN)β Dependencies vendored$(NC)"
##@ Information
info: ## Show build information
@echo "$(BLUE)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ$(NC)"
@echo "$(BLUE)β Build Information β$(NC)"
@echo "$(BLUE)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ$(NC)"
@echo ""
@echo "$(YELLOW)Project:$(NC)"
@echo " Name: $(PROJECT_NAME)"
@echo " Binary: $(BINARY_NAME)"
@echo " Config: $(CONFIG_FILE)"
@echo ""
@echo "$(YELLOW)Docker:$(NC)"
@echo " Image: $(DOCKER_IMAGE)"
@echo " Port: $(PORT)"
@echo " Container: $(CONTAINER_NAME)"
@echo ""
@echo "$(YELLOW)Go:$(NC)"
@go version
@echo ""
@echo "$(YELLOW)System:$(NC)"
@uname -a
@echo ""
@echo "$(YELLOW)Docker:$(NC)"
@docker version --format='Client: {{.Client.Version}}'
@docker version --format='Server: {{.Server.Version}}' 2>/dev/null || echo " Server: N/A"
images: ## List all images
@echo "$(YELLOW)π³ Docker images:$(NC)"
@docker images | grep -E "REPOSITORY|$(IMAGE_NAME)" || echo "$(YELLOW)β No images found$(NC)"
files: ## List project files
@echo "$(YELLOW)π Project structure:$(NC)"
@find . -type f -name "*.go" -o -name "*.yaml" -o -name "Dockerfile" -o -name "Makefile" | grep -v ".git" | sort
##@ Help & Documentation
docs: ## Open documentation
@echo "$(YELLOW)π Documentation:$(NC)"
@ls -1 *.md | grep -E "DOCKER|RUNNING|QUICKSTART|ARCHITECTURE|DEPLOYMENT|IMPLEMENTATION|INDEX"
quick-start: ## Show quick start commands
@echo "$(BLUE)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ$(NC)"
@echo "$(BLUE)β Quick Start Guide β$(NC)"
@echo "$(BLUE)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ$(NC)"
@echo ""
@echo "$(YELLOW)1. Build & Run Standalone:$(NC)"
@echo " $$ make build"
@echo " $$ make run"
@echo ""
@echo "$(YELLOW)2. Build & Run with Docker:$(NC)"
@echo " $$ make build-docker"
@echo " $$ make run-docker"
@echo ""
@echo "$(YELLOW)3. Run Full Stack with Compose:$(NC)"
@echo " $$ make run-compose"
@echo ""
@echo "$(YELLOW)4. Test the Proxy:$(NC)"
@echo " $$ make test-docker"
@echo ""
@echo "$(YELLOW)5. View Logs:$(NC)"
@echo " $$ make logs-docker"
@echo ""
@echo "$(YELLOW)6. Stop Services:$(NC)"
@echo " $$ make stop-docker"
@echo ""
all: clean build build-docker ## Build everything (clean, binary, docker)
@echo "$(GREEN)β All builds complete$(NC)"
.PHONY: all clean deps