feat(M0): 工程骨架 — Go 后端 + Vue3 前端脚手架
- Go 工程:cmd/usernode CLI(serve/migrate/admin create/reset-password/user otp)
+ internal/{config,model,service,system,auth,cron,api,router,server,pkg,webui}
- 配置:TOML + 环境变量覆盖(USERNODE_<SEC>_<FIELD>),config.example.toml
- 数据:GORM 双驱动(SQLite/MySQL)8 表模型,migrate 子命令可跑通
- 系统层:system.Manager 接口(useradd/userdel/passwd 白名单,dev dry-run)
- HTTP:Gin 路由骨架(/api/v1 + 501 占位),healthz,slog 结构化日志,优雅启停
- 前端:Vite + Vue3 + TS + Element Plus 最小可运行(web/),go:embed 打通
- 构建:deploy/Containerfile 多阶段单二进制镜像,web/Containerfile.dev 前端 dev
镜像,Makefile(build/test/dev/web-build/image);go.mod 锁定 go 1.22
- 验证:go build/vet/test 通过;podman 镜像构建运行 healthz+embed 通过
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# ws_usernode Makefile —— build / test / dev 工作流
|
||||
# 代理:容器构建无法继承 proxychains 注入,通过 --build-arg 显式传递
|
||||
# 宿主机代理环境变量(HTTP_PROXY/HTTPS_PROXY/ALL_PROXY/NO_PROXY)。
|
||||
|
||||
# ---------- 代理参数(供 podman build 使用) ----------
|
||||
HTTP_PROXY_ARG := $(if $(HTTP_PROXY),--build-arg HTTP_PROXY=$(HTTP_PROXY),)
|
||||
HTTPS_PROXY_ARG := $(if $(HTTPS_PROXY),--build-arg HTTPS_PROXY=$(HTTPS_PROXY),)
|
||||
ALL_PROXY_ARG := $(if $(ALL_PROXY),--build-arg ALL_PROXY=$(ALL_PROXY),)
|
||||
NO_PROXY_ARG := $(if $(NO_PROXY),--build-arg NO_PROXY=$(NO_PROXY),)
|
||||
PROXY_ARGS := $(HTTP_PROXY_ARG) $(HTTPS_PROXY_ARG) $(ALL_PROXY_ARG) $(NO_PROXY_ARG)
|
||||
NET_HOST := --network=host
|
||||
|
||||
GO ?= go
|
||||
PODMAN ?= podman
|
||||
BIN := bin/usernode
|
||||
VERSION ?= 0.1.0-m0
|
||||
LDFLAGS := -s -w -X main.version=$(VERSION)
|
||||
GOFLAGS := -trimpath
|
||||
|
||||
# ---------- 后端 ----------
|
||||
|
||||
.PHONY: build
|
||||
build: ## 构建 Go 二进制(后端,不含前端产物)
|
||||
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/usernode
|
||||
|
||||
.PHONY: test
|
||||
test: ## 运行全部 Go 测试
|
||||
$(GO) test ./...
|
||||
|
||||
.PHONY: vet
|
||||
vet: ## 静态检查
|
||||
$(GO) vet ./...
|
||||
|
||||
.PHONY: run
|
||||
run: build ## 本地运行(默认 config.toml,缺失则用默认配置)
|
||||
./$(BIN) serve
|
||||
|
||||
.PHONY: migrate
|
||||
migrate: build ## 数据库迁移
|
||||
./$(BIN) migrate
|
||||
|
||||
# ---------- 前端 ----------
|
||||
|
||||
.PHONY: web-install
|
||||
web-install: ## 容器内安装前端依赖(node:20-alpine),并初始化 node_modules volume
|
||||
$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode-web-dev -f web/Containerfile.dev web/
|
||||
$(PODMAN) run --rm $(NET_HOST) \
|
||||
-v ws_usernode_node_modules:/app/node_modules \
|
||||
ws-usernode-web-dev sh -c "ls node_modules >/dev/null && echo node_modules ready"
|
||||
|
||||
.PHONY: web-dev
|
||||
web-dev: ## 前端 dev 容器(热开发,端口 5173;API 代理到 Go 后端)
|
||||
$(PODMAN) run --rm -p 5173:5173 \
|
||||
-v $(CURDIR)/web:/app \
|
||||
-v ws_usernode_node_modules:/app/node_modules \
|
||||
-e VITE_API_PROXY=http://host.containers.internal:8080 \
|
||||
ws-usernode-web-dev
|
||||
|
||||
.PHONY: web-build
|
||||
web-build: ## 容器内构建前端产物到 web/dist,并复制到 internal/webui/dist(供 go:embed)
|
||||
$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode-web-dev -f web/Containerfile.dev web/
|
||||
$(PODMAN) run --rm $(NET_HOST) \
|
||||
-v $(CURDIR)/web:/app \
|
||||
-v ws_usernode_node_modules:/app/node_modules \
|
||||
-v $(CURDIR)/internal/webui/dist:/embed/dist \
|
||||
ws-usernode-web-dev sh -c "npm run build && cp -r dist/. /embed/dist/ && echo web-build ok"
|
||||
|
||||
# ---------- 镜像 / 分发 ----------
|
||||
|
||||
.PHONY: image
|
||||
image: ## 构建单二进制容器镜像(deploy/Containerfile 多阶段)
|
||||
$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode:$(VERSION) -t ws-usernode:latest -f deploy/Containerfile .
|
||||
|
||||
.PHONY: build-embed
|
||||
build-embed: web-build ## 构建含前端产物的 Go 二进制(web-build 后重新编译)
|
||||
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/usernode
|
||||
|
||||
.PHONY: dev
|
||||
dev: ## 开发提示
|
||||
@echo "后端:make run 前端:make web-dev"
|
||||
@echo "或:go run ./cmd/usernode serve --debug"
|
||||
|
||||
.PHONY: clean
|
||||
clean: ## 清理构建产物
|
||||
rm -rf bin web/dist
|
||||
|
||||
.PHONY: help
|
||||
help: ## 显示帮助
|
||||
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-14s\033[0m %s\n", $$1, $$2}'
|
||||
Reference in New Issue
Block a user