diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000..7d3396a --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,45 @@ +# Makefile for backend services + +# 默认目标 +.DEFAULT_GOAL := help + +# 帮助信息 +help: + @echo "Available commands:" + @echo " make build - 构建所有服务" + @echo " make up - 启动所有服务" + @echo " make up-dev - 启动开发模式服务(热更新)" + @echo " make down - 停止所有服务" + @echo " make logs - 查看所有服务日志" + @echo " make gen-proto - 生成 proto 文件" + @echo " make clean - 清理构建文件" + +# 构建所有服务 +build: + docker compose build + +# 启动所有服务 +up: + docker compose up -d + +# 启动开发模式服务(热更新) +up-dev: + docker compose -f docker-compose.dev.yml up -d + +# 停止所有服务 +down: + docker compose down + +# 查看所有服务日志 +logs: + docker compose logs -f + +# 生成 proto 文件 +gen-proto: + @echo "Generating proto files..." + docker compose run --rm proto-builder + +# 清理构建文件 +clean: + docker compose down -v + docker rmi -f $$(docker images -q "backend_*" 2>/dev/null) 2>/dev/null || true diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..4685fd6 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,85 @@ +# 后端微服务架构 + +这是一个基于纯 Docker 环境构建的最小化后端骨架,不需要主机依赖。 + +## 技术栈 +- golang:1.26.1-alpine3.23 +- postgres:18.3-alpine3.23 +- redis:8.6.2-alpine +- Docker/Docker Compose +- nginx:1.25-alpine + +## 目录结构 +``` +./backend/ +├── gateway/ # API 网关服务 +├── services/ # 微服务 +│ └── user-svc/ # 用户服务 +├── shared/ # 共享代码和 proto 文件 +├── scripts/ # 工具脚本 +├── docker-compose.yml # 生产环境 docker compose 文件 +├── docker-compose.dev.yml # 开发模式 docker compose 文件 +├── Makefile # Docker 命令封装 +└── README.md # 本文档 +``` + +## 快速开始 + +### 前置条件 +- Docker +- Docker Compose + +### 启动服务 +1. **构建并启动服务** + ```bash + # 使用 Makefile + make up + + # 或使用脚本 + ./scripts/dev-start.sh + ``` + +2. **以开发模式启动(热更新)** + ```bash + make up-dev + ``` + +3. **生成 proto 文件** + ```bash + make gen-proto + ``` + +4. **停止服务** + ```bash + make down + ``` + +### 访问服务 +- Nginx: http://localhost:8080 +- 网关: http://localhost:8000 +- 用户服务: http://localhost:9000 +- PostgreSQL: localhost:5432 +- Redis: localhost:6379 + +## 开发 + +### 添加新服务 +1. 在 `services/` 目录下创建新目录 +2. 添加 `Dockerfile`、`go.mod` 和必要的目录结构 +3. 更新 `docker-compose.yml` 和 `docker-compose.dev.yml` 以包含新服务 + +### Proto 文件 +- 在 `shared/proto/common/` 目录下添加 proto 文件 +- 运行 `make gen-proto` 生成 Go 代码 + +## 生产环境 + +对于生产部署,使用 `docker-compose.yml`,它会构建优化的镜像,不包含卷挂载。 + +## 清理 + +```bash +make clean +``` + +这将停止所有服务,移除卷,并清理镜像。 diff --git a/backend/docker-compose.dev.yml b/backend/docker-compose.dev.yml new file mode 100644 index 0000000..becacce --- /dev/null +++ b/backend/docker-compose.dev.yml @@ -0,0 +1,64 @@ +version: '3.8' + +services: + # Nginx 网关 + nginx: + image: nginx:1.25-alpine + ports: + - "8080:80" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - gateway + + # 网关服务 + gateway: + build: + context: ./gateway + dockerfile: Dockerfile + ports: + - "8000:8000" + volumes: + - ./gateway:/app + command: air -c .air.toml + depends_on: + - user-svc + - redis + + # 用户服务 + user-svc: + build: + context: ./services/user-svc + dockerfile: Dockerfile + ports: + - "9000:9000" + volumes: + - ./services/user-svc:/app + command: air -c .air.toml + depends_on: + - postgres + + # 数据库 + postgres: + image: postgres:18.3-alpine3.23 + environment: + POSTGRES_USER: admin + POSTGRES_PASSWORD: password + POSTGRES_DB: backend + ports: + - "5432:5432" + volumes: + - postgres-data:/var/lib/postgresql/data + - ./services/user-svc/migrations:/docker-entrypoint-initdb.d + + # Redis + redis: + image: redis:8.6.2-alpine + ports: + - "6379:6379" + volumes: + - redis-data:/var/lib/redis/data + +volumes: + postgres-data: + redis-data: \ No newline at end of file diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml new file mode 100644 index 0000000..5c97652 --- /dev/null +++ b/backend/docker-compose.yml @@ -0,0 +1,66 @@ +version: '3.8' + +services: + # Nginx 网关 + nginx: + image: nginx:1.25-alpine + ports: + - "8080:80" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - gateway + + # 网关服务 + gateway: + build: + context: ./gateway + dockerfile: Dockerfile + ports: + - "8000:8000" + depends_on: + - user-svc + - redis + + # 用户服务 + user-svc: + build: + context: ./services/user-svc + dockerfile: Dockerfile + ports: + - "9000:9000" + depends_on: + - postgres + + # 数据库 + postgres: + image: postgres:18.3-alpine3.23 + environment: + POSTGRES_USER: admin + POSTGRES_PASSWORD: password + POSTGRES_DB: backend + ports: + - "5432:5432" + volumes: + - postgres-data:/var/lib/postgresql/data + - ./services/user-svc/migrations:/docker-entrypoint-initdb.d + + # Redis + redis: + image: redis:8.6.2-alpine + ports: + - "6379:6379" + volumes: + - redis-data:/var/lib/redis/data + + # Proto 编译服务 + proto-builder: + build: + context: ./scripts/docker-proto-builder + dockerfile: Dockerfile + volumes: + - ./shared/proto:/proto + +volumes: + postgres-data: + redis-data: \ No newline at end of file diff --git a/backend/gateway/Dockerfile b/backend/gateway/Dockerfile new file mode 100644 index 0000000..66bc02a --- /dev/null +++ b/backend/gateway/Dockerfile @@ -0,0 +1,34 @@ +FROM golang:1.26.1-alpine3.23 as builder + +# 设置工作目录 +WORKDIR /app + +# 复制 go.mod 和 go.sum +COPY go.mod go.sum ./ + +# 下载依赖 +RUN go mod download + +# 复制源代码 +COPY . . + +# 构建应用 +RUN go build -o gateway ./cmd/main.go + +# 运行阶段 +FROM alpine:3.23 + +# 安装必要的依赖 +RUN apk add --no-cache ca-certificates + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制二进制文件 +COPY --from=builder /app/gateway . + +# 暴露端口 +EXPOSE 8000 + +# 启动应用 +CMD ["./gateway"] \ No newline at end of file diff --git a/backend/scripts/dev-start.sh b/backend/scripts/dev-start.sh new file mode 100644 index 0000000..3d61350 --- /dev/null +++ b/backend/scripts/dev-start.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# 纯 Docker 启动脚本 +echo "Starting backend services with Docker..." + +# 进入脚本所在目录的父目录(backend 目录) +cd "$(dirname "$0")/.." || exit 1 + +# 构建服务 +echo "Building services..." +docker compose build + +# 启动服务 +echo "Starting services..." +docker compose up -d + +# 查看服务状态 +echo "Services status:" +docker compose ps + +echo "Backend services started successfully!" +echo "Nginx: http://localhost:8080" +echo "Gateway: http://localhost:8000" +echo "User Service: http://localhost:9000" diff --git a/backend/scripts/docker-proto-builder/Dockerfile b/backend/scripts/docker-proto-builder/Dockerfile new file mode 100644 index 0000000..3396a71 --- /dev/null +++ b/backend/scripts/docker-proto-builder/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1.26.1-alpine3.23 + +# 安装 protoc 和相关工具 +RUN apk add --no-cache protobuf-dev + +# 安装 protoc-gen-go 和 protoc-gen-go-grpc +RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@latest +RUN go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest + +# 设置工作目录 +WORKDIR /proto + +# 生成 proto 文件的命令 +CMD protoc --go_out=. --go-grpc_out=. common/*.proto \ No newline at end of file diff --git a/backend/scripts/gen-proto.sh b/backend/scripts/gen-proto.sh new file mode 100644 index 0000000..a1c1e0b --- /dev/null +++ b/backend/scripts/gen-proto.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Docker 内编译 proto 脚本 +echo "Generating proto files..." + +# 进入脚本所在目录的父目录(backend 目录) +cd "$(dirname "$0")/.." || exit 1 + +# 运行 proto-builder 容器 +docker compose run --rm proto-builder + +echo "Proto files generated successfully!" diff --git a/backend/services/user-svc/Dockerfile b/backend/services/user-svc/Dockerfile new file mode 100644 index 0000000..e570312 --- /dev/null +++ b/backend/services/user-svc/Dockerfile @@ -0,0 +1,34 @@ +FROM golang:1.26.1-alpine3.23 as builder + +# 设置工作目录 +WORKDIR /app + +# 复制 go.mod 和 go.sum +COPY go.mod go.sum ./ + +# 下载依赖 +RUN go mod download + +# 复制源代码 +COPY . . + +# 构建应用 +RUN go build -o user-svc ./cmd/main.go + +# 运行阶段 +FROM alpine:3.23 + +# 安装必要的依赖 +RUN apk add --no-cache ca-certificates + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制二进制文件 +COPY --from=builder /app/user-svc . + +# 暴露端口 +EXPOSE 9000 + +# 启动应用 +CMD ["./user-svc"] \ No newline at end of file diff --git a/prompt/v2.md b/prompt/v2.md new file mode 100644 index 0000000..5806ad2 --- /dev/null +++ b/prompt/v2.md @@ -0,0 +1,77 @@ +# 一、前言 + +我需要一个单机多服务部署的后台微服务架构。 + +> 执行目标:基于纯 Docker 环境构建可编译、可运行的最小化后端骨架,无宿主机依赖(无全局 Go/Protoc/Postgres/Redis 环境) + +> 技术栈锁定:golang:1.26.1-alpine3.23、postgres:18.3-alpine3.23、redis:8.6.2-alpine、Docker/Docker Compose、nginx:1.25-alpine + +# 二、完整目录结构 + +``` +./backend/ +├── gateway/ +│ ├── cmd/ +│ │ └── main.go +│ ├── internal/ +│ │ ├── config/ +│ │ │ └── config.go +│ │ ├── ws/ +│ │ │ ├── hub.go +│ │ │ ├── client.go +│ │ │ └── message.go +│ │ └── router/ +│ │ └── router.go +│ ├── go.mod +│ └── Dockerfile +├── services/ +│ └── user-svc/ +│ ├── cmd/ +│ │ └── main.go +│ ├── internal/ +│ │ ├── config/ +│ │ │ └── config.go +│ │ ├── domain/ +│ │ │ └── user.go +│ │ ├── repository/ +│ │ │ └── repo.go +│ │ ├── service/ +│ │ │ └── service.go +│ │ └── grpcserver/ +│ │ └── server.go +│ ├── proto/ +│ │ └── user.proto +│ ├── migrations/ +│ │ └── 001_init.sql +│ ├── go.mod +│ └── Dockerfile +├── shared/ +│ ├── proto/ +│ │ ├── common/ +│ │ │ └── common.proto +│ │ └── generate.go +│ └── pkg/ +│ ├── logger/ +│ │ └── logger.go +│ ├── errors/ +│ │ └── errors.go +│ ├── database/ +│ │ └── postgres.go +│ └── cache/ +│ └── redis.go +├── scripts/ +│ ├── dev-start.sh # 纯 Docker 启动脚本 +│ ├── gen-proto.sh # Docker 内编译 proto +│ └── docker-proto-builder/ # Protoc 编译容器配置 +│ └── Dockerfile +├── docker-compose.yml # 全服务编排(含 proto 编译、Go 构建) +├── docker-compose.dev.yml # 开发模式编排(挂载源码、热更新) +├── Makefile # 封装 Docker 命令(兼容无宿主机 Make 环境) +└── README.md # 纯 Docker 环境使用说明 +``` + +# 三、核心说明 + +不允污染宿主机,任何操作都只能通过 Docker 进行,绝对不在本地执行任何命令,不依赖本地环境,纯容器运行。 + +以上需求明白后,先创建基础骨架:包含 nginx、gateway、services/user-svc、shared、scripts、docker-compose.yml、Makefile,只创建目录结构,不写代码,让后等待我下一步指令。 \ No newline at end of file