201 lines
6.9 KiB
Makefile
201 lines
6.9 KiB
Makefile
# 巡樓 monorepo Makefile
|
||
# 兩種模式:
|
||
# dev - 本機開發(docker 起 Mongo/Redis,go run / vite dev 在本機跑)
|
||
# docker - 全棧一鍵啟動(Mongo/Redis/gateway/worker/node-worker/web 全在 docker)
|
||
#
|
||
# 常用:
|
||
# make up # 一鍵:build + 啟動整套(含前後端、worker、DB)
|
||
# make down # 停掉整套
|
||
# make logs # 追全部日誌
|
||
# make dev-infra # 本機開發:只起 Mongo/Redis
|
||
# make dev-backend # 本機開發:go run gateway (:8890)
|
||
# make dev-frontend # 本機開發:vite dev (:5173)
|
||
|
||
SHELL := /bin/bash
|
||
|
||
# --- 路徑 ---
|
||
BACKEND_DIR := backend
|
||
FRONTEND_DIR := frontend
|
||
|
||
# --- docker compose(prod 全棧)---
|
||
COMPOSE_FILE := deploy/docker-compose.yml
|
||
ENV_FILE := deploy/.env
|
||
COMPOSE := docker compose -f $(COMPOSE_FILE) --env-file $(ENV_FILE)
|
||
|
||
# --- docker compose(本地測試;base + dev override + dev env)---
|
||
DEV_ENV_FILE := deploy/.env.dev
|
||
DEV_COMPOSE := docker compose -f $(COMPOSE_FILE) -f deploy/docker-compose.dev.yml --env-file $(DEV_ENV_FILE)
|
||
# go worker 用 gateway 內嵌,dev 不啟動獨立 worker 容器
|
||
DEV_SERVICES := mongo redis init gateway node-worker web
|
||
|
||
# --- dev 用 worker secret(對應 etc/gateway.yaml 的 InternalWorker.Secret)---
|
||
DEV_WORKER_SECRET := haixun-dev-worker-secret
|
||
DEV_BACKEND_URL := http://127.0.0.1:8890
|
||
|
||
.DEFAULT_GOAL := help
|
||
|
||
.PHONY: help
|
||
help: ## 顯示可用指令
|
||
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
|
||
| awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
||
|
||
$(ENV_FILE):
|
||
@test -f $(ENV_FILE) || (cp deploy/.env.example $(ENV_FILE) && echo "已從 deploy/.env.example 建立 $(ENV_FILE),請填入密碼與 secret 後再 make up")
|
||
|
||
# ============================================================
|
||
# DOCKER(全棧一鍵)
|
||
# ============================================================
|
||
|
||
.PHONY: up
|
||
up: $(ENV_FILE) ## [docker] 一鍵啟動整套(build + up,背景)
|
||
$(COMPOSE) up -d --build
|
||
@echo ""
|
||
@echo "=== 啟動中 ==="
|
||
@echo " 前端: http://localhost:$$(grep -E '^WEB_PORT=' $(ENV_FILE) | cut -d= -f2)"
|
||
@echo " 健康檢查: curl http://localhost:$$(grep -E '^WEB_PORT=' $(ENV_FILE) | cut -d= -f2)/api/v1/health"
|
||
@echo " 看狀態: make ps 看日誌: make logs"
|
||
|
||
.PHONY: down
|
||
down: ## [docker] 停掉整套(保留資料 volume)
|
||
$(COMPOSE) down
|
||
|
||
.PHONY: down-clean
|
||
down-clean: ## [docker] 停掉整套並刪除資料 volume(清空 Mongo/Redis)
|
||
$(COMPOSE) down -v
|
||
|
||
.PHONY: build
|
||
build: $(ENV_FILE) ## [docker] 只 build image,不啟動
|
||
$(COMPOSE) build
|
||
|
||
.PHONY: rebuild
|
||
rebuild: $(ENV_FILE) ## [docker] 無快取重新 build 並重啟
|
||
$(COMPOSE) build --no-cache
|
||
$(COMPOSE) up -d
|
||
|
||
.PHONY: restart
|
||
restart: ## [docker] 重啟所有服務
|
||
$(COMPOSE) restart
|
||
|
||
.PHONY: ps
|
||
ps: ## [docker] 看服務狀態
|
||
$(COMPOSE) ps
|
||
|
||
.PHONY: logs
|
||
logs: ## [docker] 追全部日誌(Ctrl-C 離開)
|
||
$(COMPOSE) logs -f
|
||
|
||
.PHONY: logs-gateway
|
||
logs-gateway: ## [docker] 只看 gateway 日誌
|
||
$(COMPOSE) logs -f gateway
|
||
|
||
.PHONY: init
|
||
init: $(ENV_FILE) ## [docker] 重跑一次 DB 初始化(索引/權限/admin,冪等)
|
||
$(COMPOSE) run --rm init
|
||
|
||
.PHONY: config
|
||
config: $(ENV_FILE) ## [docker] 驗證 compose 設定
|
||
$(COMPOSE) config >/dev/null && echo "docker compose config OK"
|
||
|
||
# ============================================================
|
||
# DEV(本地測試,全走 docker)
|
||
# ============================================================
|
||
|
||
.PHONY: dev-up
|
||
dev-up: ## [dev] 一鍵:本地 docker 測試(gateway 開 :8890,web 開 :8080,go worker 內嵌)
|
||
$(DEV_COMPOSE) up -d --build $(DEV_SERVICES)
|
||
@echo ""
|
||
@echo "=== 本地測試啟動中 ==="
|
||
@echo " 前端: http://localhost:$$(grep -E '^WEB_PORT=' $(DEV_ENV_FILE) | cut -d= -f2)"
|
||
@echo " API: http://localhost:8890/api/v1/health"
|
||
@echo " DevHeaderFallback 已開(可用 X-Tenant-ID / X-UID 模擬登入)"
|
||
|
||
.PHONY: dev-down
|
||
dev-down: ## [dev] 停掉本地 docker(保留資料)
|
||
$(DEV_COMPOSE) down
|
||
|
||
.PHONY: dev-down-clean
|
||
dev-down-clean: ## [dev] 停掉本地 docker 並清空資料 volume
|
||
$(DEV_COMPOSE) down -v
|
||
|
||
.PHONY: dev-rebuild
|
||
dev-rebuild: ## [dev] 改 code 後重新 build 並重啟本地 docker
|
||
$(DEV_COMPOSE) up -d --build $(DEV_SERVICES)
|
||
|
||
.PHONY: dev-restart
|
||
dev-restart: ## [dev] 只重啟(改了 etc/*.yaml 後不用 rebuild,掛載即生效)
|
||
$(DEV_COMPOSE) restart gateway node-worker
|
||
|
||
.PHONY: dev-ps
|
||
dev-ps: ## [dev] 看本地 docker 狀態
|
||
$(DEV_COMPOSE) ps
|
||
|
||
.PHONY: dev-logs
|
||
dev-logs: ## [dev] 追本地 docker 日誌
|
||
$(DEV_COMPOSE) logs -f
|
||
|
||
.PHONY: dev-init
|
||
dev-init: ## [dev] 重跑一次 DB 初始化(索引/權限/admin,冪等)
|
||
$(DEV_COMPOSE) run --rm init
|
||
|
||
.PHONY: dev
|
||
dev: ## [dev] 本地 docker 測試說明
|
||
@echo "本地測試(全 docker):"
|
||
@echo " make dev-up # 一鍵起整套(前端 :8080、API :8890)"
|
||
@echo " make dev-logs # 看日誌"
|
||
@echo " make dev-restart # 改 etc/*.yaml 後重啟(免 rebuild)"
|
||
@echo " make dev-rebuild # 改 Go/前端 code 後重 build"
|
||
@echo " make dev-down # 停(保留資料)"
|
||
|
||
# --- 進階:不進 docker,直接本機 go run / vite(需自備 Go/Node)---
|
||
.PHONY: local-infra
|
||
local-infra: ## [local] 只起 Mongo + Redis(docker),其餘本機跑
|
||
$(DEV_COMPOSE) up -d mongo redis
|
||
$(DEV_COMPOSE) ps
|
||
|
||
.PHONY: local-backend
|
||
local-backend: ## [local] 本機 go run gateway (:8890)
|
||
cd $(BACKEND_DIR) && go run . -f etc/gateway.yaml
|
||
|
||
.PHONY: local-worker
|
||
local-worker: ## [local] 本機 go run Go job worker (:8891)
|
||
cd $(BACKEND_DIR) && go run ./cmd/worker -f etc/gateway.worker.yaml
|
||
|
||
.PHONY: local-node-worker
|
||
local-node-worker: ## [local] 本機跑 Node playwright worker (style-8d)
|
||
cd $(BACKEND_DIR)/worker && npm install && \
|
||
HAIXUN_WORKER_SECRET=$(DEV_WORKER_SECRET) HAIXUN_BACKEND_URL=$(DEV_BACKEND_URL) npm run style-8d
|
||
|
||
.PHONY: local-frontend
|
||
local-frontend: ## [local] 本機跑前端 dev server (:5173)
|
||
cd $(FRONTEND_DIR) && npm install && npm run dev
|
||
|
||
.PHONY: local-init
|
||
local-init: ## [local] 本機初始化 DB(索引/權限)並建立 admin
|
||
cd $(BACKEND_DIR) && go run ./cmd/tool init -f etc/gateway.yaml
|
||
|
||
# ============================================================
|
||
# 驗證 / 維護
|
||
# ============================================================
|
||
|
||
.PHONY: tidy
|
||
tidy: ## go mod tidy
|
||
cd $(BACKEND_DIR) && go mod tidy
|
||
|
||
.PHONY: gen-api
|
||
gen-api: ## 用 goctl 從 .api 重新產生 handler/logic/types/routes
|
||
cd $(BACKEND_DIR) && goctl api go -api generate/api/gateway.api -dir . -home generate/goctl -style go_zero
|
||
|
||
.PHONY: fmt
|
||
fmt: ## gofmt 後端
|
||
cd $(BACKEND_DIR) && gofmt -w .
|
||
|
||
.PHONY: test
|
||
test: ## 跑後端測試
|
||
cd $(BACKEND_DIR) && go test ./...
|
||
|
||
.PHONY: verify
|
||
verify: $(ENV_FILE) ## 後端 build/test + 前端 build + compose 語法
|
||
cd $(BACKEND_DIR) && go build ./... && go test ./...
|
||
cd $(FRONTEND_DIR) && npm ci && npm run build
|
||
$(COMPOSE) config >/dev/null && echo "docker compose config OK"
|