# TopFans Backend Makefile # 用于简化开发流程 .PHONY: help install-swagger gen-swagger update-swagger start-swagger start-all stop-all clean build run all loadgen-build loadgen-test loadgen-vet loadgen-ci loadgen-seed-local loadgen-seed-prod-tunnel loadgen-cleanup-local loadgen-cleanup-local-full loadgen-cleanup-prod-tunnel loadgen-cleanup-prod-tunnel-full loadgen-report # 默认目标 help: @echo "TopFans Backend - 可用命令:" @echo "" @echo "Swagger 相关:" @echo " make install-swagger - 安装 Swagger 依赖" @echo " make gen-swagger - 生成 Swagger 文档" @echo " make update-swagger - 更新 Swagger 文档(代码修改后)" @echo " make start-swagger - 启动 Gateway 并打开 Swagger UI" @echo "" @echo "服务管理:" @echo " make start-all - 启动所有服务(含 Swagger)" @echo " make stop-all - 停止所有服务" @echo " make restart-all - 重启所有服务(含重新生成 Swagger)" @echo "" @echo "开发相关:" @echo " make build - 构建 Gateway" @echo " make run - 运行 Gateway" @echo " make all - 安装依赖 + 生成文档 + 构建" @echo "" @echo "压测工具:" @echo " make loadgen-build - 编译 seed + loadgen 到 bin/" @echo " make loadgen-test - 运行 loadgen 单元测试" @echo " make loadgen-vet - go vet 静态检查" @echo "" @echo "压测 seed 便捷入口 (免去手敲 flag):" @echo " make loadgen-seed-local - seed 写入本地 docker dev (top-fans:15432)" @echo " make loadgen-seed-prod-tunnel - seed 通过 SSH 端口转发写生产 (127.0.0.1:25432)" @echo " make loadgen-cleanup-local - 清理本地 docker 压测数据 (保留账号)" @echo " make loadgen-cleanup-local-full - 全清本地 docker 压测数据 (含 users + stars)" @echo " make loadgen-cleanup-prod-tunnel - 清理生产 docker 压测数据 (保留账号,走 SSH 转发)" @echo " make loadgen-cleanup-prod-tunnel-full - 全清生产压测数据 (含 users + stars,适合彻底收尾)" @echo "" @echo "清理:" @echo " make clean - 清理生成的文件" @echo "" @echo "Swagger 相关:" @echo " make install-swagger - 安装 Swagger 依赖" @echo " make gen-swagger - 生成 Swagger 文档" @echo " make update-swagger - 更新 Swagger 文档(代码修改后)" @echo " make start-swagger - 启动 Gateway 并打开 Swagger UI" @echo "" @echo "开发相关:" @echo " make build - 构建 Gateway" @echo " make run - 运行 Gateway" @echo " make all - 安装依赖 + 生成文档 + 构建" @echo "" @echo "压测工具:" @echo " make loadgen-build - 编译 seed + loadgen 到 bin/" @echo " make loadgen-test - 运行 loadgen 单元测试" @echo " make loadgen-vet - go vet 静态检查" @echo "" @echo "压测 seed 便捷入口 (免去手敲 flag):" @echo " make loadgen-seed-local - seed 写入本地 docker dev (top-fans:15432)" @echo " make loadgen-seed-prod-tunnel - seed 通过 SSH 端口转发写生产 (127.0.0.1:25432)" @echo " make loadgen-cleanup-local - 清理本地 docker 压测数据 (保留账号)" @echo " make loadgen-cleanup-local-full - 全清本地 docker 压测数据 (含 users + stars)" @echo " make loadgen-cleanup-prod-tunnel - 清理生产 docker 压测数据 (保留账号,走 SSH 转发)" @echo " make loadgen-cleanup-prod-tunnel-full - 全清生产压测数据 (含 users + stars,适合彻底收尾)" @echo "" @echo "清理:" @echo " make clean - 清理生成的文件" # 安装 Swagger 依赖 install-swagger: @echo "安装 Swagger 依赖..." @bash install-swagger-deps.sh # 生成 Swagger 文档 gen-swagger: @echo "生成 Swagger 文档..." @bash gen-swagger.sh # 更新 Swagger 文档 update-swagger: @echo "更新 Swagger 文档..." @bash update-swagger.sh # 启动所有服务(含 Swagger) start-all: @echo "启动所有服务(含 Swagger)..." @bash start-all.sh # 停止所有服务 stop-all: @echo "停止所有服务..." @bash stop-all.sh # 重启所有服务(含重新生成 Swagger) restart-all: stop-all start-all # 构建 Gateway build: @echo "构建 Gateway..." @cd backend/gateway && go build -o gateway . # 完整编译验证: 编译所有包(含未被 main 包 import 的 client 库 + 所有测试文件) # 用 `go test -run='^$'` 的副作用:它会编译所有包和测试文件,但 `-run='^$'` 匹配空串 → 0 个测试运行 # 这是覆盖 client RPC 库、未被依赖的 service 包的唯一标准做法 # 普通 `go build ./...` 不会扫到这些包,容易漏改 build-all: @echo "完整编译验证(覆盖所有包,含 client 库)..." @go test -count=1 -run='^$$' ./... # 运行 Gateway run: @echo "运行 Gateway..." @cd backend/gateway && ./gateway # 清理生成的文件 clean: @echo "清理生成的文件..." @rm -rf backend/gateway/docs/*.go @rm -rf backend/gateway/docs/*.json @rm -rf backend/gateway/docs/*.yaml @rm -rf backend/bin/ @echo "✅ 清理完成" # ==================== Loadgen / 压测工具 ==================== # 编译 seed 和 loadgen 二进制到 bin/ loadgen-build: @echo "编译 loadgen 工具..." @mkdir -p bin @go build -ldflags="-s -w" -o bin/seed ./scripts/loadgen/seed/ @go build -ldflags="-s -w" -o bin/loadgen ./scripts/loadgen/loadgen/ @echo "✅ seed + loadgen → bin/" # 运行 loadgen 单元测试 (当前 23 个测试, 应全过) loadgen-test: @echo "运行 loadgen 单元测试..." @go test -count=1 ./scripts/loadgen/... # go vet 静态检查 loadgen-vet: @echo "go vet loadgen..." @go vet ./scripts/loadgen/... # loadgen 完整 CI 入口: vet + test + build loadgen-ci: loadgen-vet loadgen-test loadgen-build # ============================================================ # 压测 seed 便捷入口 (按部署环境封装 DB 参数) # ============================================================ # # 三种部署对应的 DB 参数 (详见 backend/scripts/loadgen/seed/README.md): # 1. 生产机直跑 : localhost:5432/topfans (seed 默认值, ssh 进去直接跑) # 2. 本地联调 : localhost:15432/top-fans (宿主机 postgresql-database-1) # 3. 本地连生产 : 127.0.0.1:25432/topfans (ssh -L 端口转发) # # 密码统一从对应 .env 文件读 (.env.prod / .env.local),避免在命令行明文泄露。 # --- 本地 docker dev (top-fans:15432, 密码 123456) --- loadgen-seed-local: loadgen-build @echo ">>> seed 写入本地 docker dev (top-fans:15432)" @DB_PASSWORD=$$(grep '^DB_PASSWORD=' ../docker/.env.local | cut -d= -f2) \ JWT_SECRET=$$(grep '^JWT_SECRET=' ../docker/.env.local | cut -d= -f2) \ ./bin/seed \ --db-host=localhost --db-port=15432 --db-name=top-fans --db-user=postgres loadgen-cleanup-local: loadgen-build @echo ">>> 清理本地 docker 压测数据 (top-fans:15432,保留账号)" @DB_PASSWORD=$$(grep '^DB_PASSWORD=' ../docker/.env.local | cut -d= -f2) \ ./bin/seed --cleanup \ --db-host=localhost --db-port=15432 --db-name=top-fans --db-user=postgres # 全清版本:含 users + stars。跟 loadgen-cleanup-prod-tunnel-full 对称。 loadgen-cleanup-local-full: loadgen-build @echo ">>> ⚠️ 全清本地 docker 压测数据 (top-fans:15432,含 users + stars)" @DB_PASSWORD=$$(grep '^DB_PASSWORD=' ../docker/.env.local | cut -d= -f2) \ ./bin/seed --cleanup --full \ --db-host=localhost --db-port=15432 --db-name=top-fans --db-user=postgres # --- 本地连生产 (ssh -L 25432 → 生产 docker 5432) --- # 调用前请确保已建立转发: ssh -L 25432:127.0.0.1:5432 -N -f root@101.132.250.62 loadgen-seed-prod-tunnel: loadgen-build @echo ">>> seed 通过 SSH 隧道写生产 (127.0.0.1:25432 → docker 5432)" @if ! lsof -iTCP:25432 -sTCP:LISTEN >/dev/null 2>&1; then \ echo "❌ 25432 端口未监听,请先: ssh -L 25432:127.0.0.1:5432 -N -f root@101.132.250.62"; \ exit 1; \ fi @DB_PASSWORD=$$(grep '^DB_PASSWORD=' ../docker/.env.prod | cut -d= -f2) \ JWT_SECRET=$$(grep '^JWT_SECRET=' ../docker/.env.prod | cut -d= -f2) \ ./bin/seed \ --db-host=127.0.0.1 --db-port=25432 --db-name=topfans --db-user=postgres loadgen-cleanup-prod-tunnel: loadgen-build @echo ">>> 清理生产 docker 压测数据 (走 SSH 隧道, 保留账号)" @if ! lsof -iTCP:25432 -sTCP:LISTEN >/dev/null 2>&1; then \ echo "❌ 25432 端口未监听,请先: ssh -L 25432:127.0.0.1:5432 -N -f root@101.132.250.62"; \ exit 1; \ fi @DB_PASSWORD=$$(grep '^DB_PASSWORD=' ../docker/.env.prod | cut -d= -f2) \ ./bin/seed --cleanup \ --db-host=127.0.0.1 --db-port=25432 --db-name=topfans --db-user=postgres # 全清:连同 users + stars 都删。适合"压测彻底收尾"场景,不是"多轮压测保留账号"。 # 跟 loadgen-cleanup-prod-tunnel 的区别仅在末尾的 --full。 loadgen-cleanup-prod-tunnel-full: loadgen-build @echo ">>> ⚠️ 全清生产 docker 压测数据 (含 users + stars,走 SSH 隧道)" @if ! lsof -iTCP:25432 -sTCP:LISTEN >/dev/null 2>&1; then \ echo "❌ 25432 端口未监听,请先: ssh -L 25432:127.0.0.1:5432 -N -f root@101.132.250.62"; \ exit 1; \ fi @DB_PASSWORD=$$(grep '^DB_PASSWORD=' ../docker/.env.prod | cut -d= -f2) \ ./bin/seed --cleanup --full \ --db-host=127.0.0.1 --db-port=25432 --db-name=topfans --db-user=postgres # 把 reports/ 下的 S*.json + run-metadata.json 合成 final-report.md loadgen-report: loadgen-build @echo ">>> 生成 final-report.md" @./bin/loadgen --cmd=report --input=./reports --output=./reports/final-report.md @echo "✅ final-report.md 已更新" @ls -la reports/final-report.md # 全部:安装依赖 + 生成文档 + 构建 all: install-swagger gen-swagger build @echo "" @echo "✅ 所有步骤完成!" @echo " 现在可以运行: make start-swagger"