Heyyprakhar1/microservices-ecommerce-devsecops

GitHub: Heyyprakhar1/microservices-ecommerce-devsecops

一个基于 Flask 微服务、JWT 与 Google OAuth 的电商示例,集成 7 阶段 DevSecOps 流水线以解决实战化 DevOps 与安全治理难题。

Stars: 1 | Forks: 0

# 🛒 微服务电商平台 ### DevSecOps · Kubernetes · Google OAuth · 7阶段 CI/CD 流水线 [![Docker](https://img.shields.io/badge/Docker-2496ED?style=flat-square&logo=docker&logoColor=white)](.) [![Kubernetes](https://img.shields.io/badge/Kubernetes-326CE5?style=flat-square&logo=kubernetes&logoColor=white)](.) [![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-2088FF?style=flat-square&logo=githubactions&logoColor=white)](.) [![Trivy](https://img.shields.io/badge/Trivy-1904DA?style=flat-square&logo=aquasecurity&logoColor=white)](.) [![Gitleaks](https://img.shields.io/badge/Gitleaks-181717?style=flat-square&logo=github&logoColor=white)](.) [![Hadolint](https://img.shields.io/badge/Hadolint-2496ED?style=flat-square&logo=docker&logoColor=white)](.) ## 这是什么 三个 Flask 微服务 —— Auth、Product、Order,每个服务拥有独立 MySQL 数据库,并通过 Nginx API 网关运行。构建目的是实践真实的 DevOps 工作流,而非跟随教程。 每次推送到 `main` 分支都会经过 7 阶段 DevSecOps 流水线。所有阶段通过前,没有服务会被部署到服务器。Auth 支持密码登录和 Google OAuth。 这不是玩具项目。目标是做出能够在求职面试中经得起追问的项目。 ## 服务 | 服务 | 端口 | 功能 | |---|---|---| | Auth 服务 | 5001 | 注册、登录、Google OAuth、JWT 令牌 | | 产品服务 | 5002 | 产品目录、库存 CRUD | | 订单服务 | 5003 | 下单与追踪订单 | | Nginx 网关 | 80 | 所有流量的单一入口点 | ## 技术栈 | 层级 | 工具 | |---|---| | 服务 | Python、Flask、SQLAlchemy | | 认证 | JWT + Google OAuth 2.0 (Authlib) | | 数据库 | MySQL 8.0 | | 容器 | Docker、Docker Compose | | 镜像仓库 | Docker Hub | | CI/CD | GitHub Actions(7 个工作流) | | 安全 | Trivy、Gitleaks、Hadolint、Bandit、pip-audit | | 编排 | Kubernetes(本地 kind),计划部署 EKS | | GitOps | 计划使用 Argo CD | | 监控 | 计划使用 Prometheus + Grafana | ## 认证 —— 两种登录方式 标准邮箱/密码注册与登录。此外支持 Google OAuth —— 在浏览器中访问 `/api/auth/google/login`,使用 Google 登录后即可获得 JWT。两种方式的令牌格式一致,因此系统其余部分不关心具体的认证方式。 ``` GET /api/auth/google/login → redirects to Google GET /api/auth/google/callback → Google returns here → JWT issued ``` Google 用户会在首次登录时自动创建账户。其密码字段保持为 null —— 尝试使用密码登录 Google 账户会返回 401。 ## API 路由 ### 认证 — `/api/auth` | 方法 | 路由 | 认证 | 描述 | |---|---|---|---| | GET | `/health` | 否 | 健康检查 | | POST | `/register` | 否 | 创建账户 | | POST | `/login` | 否 | 获取 JWT 令牌 | | POST | `/verify` | Bearer | 验证令牌 | | GET | `/google/login` | 否 | 启动 Google OAuth | | GET | `/google/callback` | 否 | Google OAuth 回调 | ### 产品 — `/api/products` | 方法 | 路由 | 认证 | 描述 | |---|---|---|---| | GET | `/health` | 否 | 健康检查 | | GET | `/` | 否 | 列出所有产品 | | GET | `/` | 否 | 获取单个产品 | | POST | `/` | JWT | 添加产品 | | PUT | `/` | JWT | 更新产品 | | DELETE | `/` | JWT | 删除产品 | ### 订单 — `/api/orders` | 方法 | 路由 | 认证 | 描述 | |---|---|---|---| | GET | `/health` | 否 | 健康检查 | | POST | `/` | JWT | 下单 | | GET | `/` | JWT | 获取我的订单 | | GET | `/` | JWT | 获取单个订单 | | PUT | `//status` | JWT | 更新订单状态 | ## DevSecOps 流水线 ``` Push to main │ ├── code-quality-scan (Flake8 + Bandit) ├── dependency-scan (pip-audit) ├── secrets-scan (Gitleaks) ├── dockerfile-scan (Hadolint) │ ▼ all pass │ ├── docker-build-push (build + push to Docker Hub) │ ▼ ├── image-scan (Trivy — HIGH/CRITICAL CVEs block deploy) │ ▼ └── deploy-to-server (SSH → docker compose up) ``` **统计:** 7 个工作流 · 69+ 次提交 · 平均端到端约 3 分 14 秒 · 零密钥泄露 ## Dockerfile 多阶段构建,所有服务均使用非 root 用户运行。 ``` # 阶段 1 — 构建器 FROM python:3.12-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir --prefix=/install -r requirements.txt # 阶段 2 — 运行时,非 root FROM python:3.12-slim RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser WORKDIR /app COPY --from=builder /install /usr/local COPY app/ ./app/ COPY run.py . RUN chown -R appuser:appgroup /app USER appuser ``` ## 本地运行 **前提条件:** 已安装 Docker 和 Docker Compose。 ``` git clone https://github.com/Heyyprakhar1/microservices-ecommerce-devsecops.git cd microservices-ecommerce-devsecops docker compose up --build -d ``` 三个服务与 MySQL 会自动启动。`init.sql` 会在首次运行时创建三个数据库。 **快速测试:** ``` # 注册 curl -X POST http://localhost:5001/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"prakhar","email":"p@test.com","password":"test123"}' # 登录 TOKEN=$(curl -s -X POST http://localhost:5001/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"p@test.com","password":"test123"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])") # Google OAuth(在浏览器中打开) # http://localhost:5001/api/auth/google/login # 创建产品 curl -X POST http://localhost:5002/api/products/ \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{"name":"Nike Shoes","price":99.99,"stock":50,"category":"footwear"}' ``` ## 项目结构 ``` microservices-ecommerce-devsecops/ ├── services/ │ ├── auth-service/ │ │ ├── app/ │ │ │ ├── __init__.py │ │ │ ├── config.py │ │ │ ├── models.py │ │ │ └── routes.py │ │ ├── Dockerfile │ │ ├── requirements.txt │ │ └── run.py │ ├── product-service/ │ └── order-service/ ├── k8s/ │ ├── auth-service/ │ ├── product-service/ │ ├── order-service/ │ ├── mysql/ │ └── ingress.yaml ├── .github/ │ └── workflows/ │ ├── DevSecOps-pipeline.yml │ ├── code_quality.yml │ ├── dependency_scan.yml │ ├── secrets-scan.yml │ ├── dockerfile-scan.yml │ ├── docker-build-push.yml │ ├── image-scan.yml │ └── deploy_to_server.yml ├── terraform/ ├── docker-compose.yml └── init.sql ``` ## 状态 - ✅ 认证服务(Flask + MySQL + JWT + Google OAuth) - ✅ 产品服务 - ✅ 订单服务 - ✅ 多阶段 Dockerfile(非 root 用户) - ✅ Docker Compose - ✅ DevSecOps 流水线(7 阶段,69+ 次运行) - ✅ Kubernetes 清单(HPA、Ingress、命名空间) - ✅ Terraform(AWS EC2 配置) - ⏳ EKS 部署 - ⏳ Helm Chart - ⏳ Argo CD(GitOps) - ⏳ Prometheus + Grafana 监控 - ⏳ AI 聊天机器人服务(Ollama)
**由 [Prakhar Srivastava](https://github.com/Heyyprakhar1)** 构建 · [作品集](https://prakharsrivastavadevops.netlify.app/) · [领英](https://linkedin.com/in/heyyprakhar1)
标签:7阶段, Argo CD, Bandit, DevSecOps, Docker, Docker Compose, Docker Hub, EKS, Flask, GitHub Actions, Gitleaks, Google OAuth, Hadolint, JWT, Nginx, NIDS, pip-audit, Python, SQLAlchemy, 上游代理, 单体网关, 后端, 多引擎聚合, 子域名突变, 安全扫描, 安全防御评估, 容器化, 左移安全, 库存管理, 无后门, 时序注入, 服务注册, 流水线, 电商, 监控系统, 网关, 自动笔记, 计划中, 订单管理, 认证, 请求拦截, 逆向工具, 面试实战