hunjanhar/news-sphere-app
GitHub: hunjanhar/news-sphere-app
一个基于 MERN 架构的全栈新闻聚合平台,结合 Terraform、Jenkins、ArgoCD 实现从基础设施到应用部署的全自动化 DevSecOps 流水线。
Stars: 0 | Forks: 0
# NewsSphere — 全栈新闻应用
一个使用 React、Node.js、MongoDB 和 Redis 构建的全栈新闻聚合与社区平台 — 部署在运行 Minikube 作为 Kubernetes 平台的单个 AWS EC2 实例上,并由 Jenkins、ArgoCD 和 HashiCorp Vault 驱动全自动化的 CI/CD pipeline。
## 架构图

## 项目概述
NewsSphere 允许用户浏览头条新闻、注册/登录、对文章进行评论以及联系团队。后端从外部 API 代理新闻,并将响应缓存在 Redis 中。所有应用数据(用户、评论、联系提交)均持久化存储在 MongoDB 中。
整个基础设施 — 从 AWS VPC 到 Kubernetes deployments — 均使用 Terraform(基础设施)和 Ansible(配置)以代码形式进行管理,然后通过 ArgoCD 的 GitOps workflow 进行部署并保持同步。






## CI/CD Pipeline
该 pipeline 分为两个按顺序协同工作的 Jenkins 作业。
### CI Pipeline (`Jenkinsfile.ci`)
在每次推送到 `main` 分支时运行。
```
Fetch Source Code
│
Install Dependencies (frontend + backend npm install)
│
Run Tests (Vitest for frontend, Jest for backend) [parallel]
│
Security Scans
├── TruffleHog (secrets scan on git history)
└── Trivy (filesystem vulnerability scan)
│
SonarQube Code Analysis
│
Generate Image Tag → {BUILD_NUMBER}-{short-commit}
│
Docker Build
├── Build frontend image
├── Trivy scan frontend image
├── Build backend image
└── Trivy scan backend image
│
Push to Docker Hub → hunjanhar/news-sphere-{frontend,backend}:{tag}
│
Trigger CD Pipeline (passing IMAGE_TAG)
```
### CD Pipeline (`Jenkinsfile.cd`)
在成功构建后由 CI 自动触发。
```
Verify Images on Docker Hub
│
Update k8s Manifests → sed image tags in k8s/prod-deployment/
│
kubectl dry-run validation
│
Push Secrets to Vault
└── kv put secret/production/news-sphere {MONGO_URL, REDIS_URL, ...}
│
kubectl create/refresh namespace + Vault token secret
│
Git Commit + Push updated manifests to prod branch
│
Apply ArgoCD Application (if not already running)
│
ArgoCD Sync + Health Check → wait for Succeeded + Healthy
│
Port-Forward Services
├── ArgoCD :8085
├── Grafana :3000
├── Prometheus :9090
└── App via Ingress :5000
│
OWASP ZAP DAST Scan → full scan against live app URL
│
Email Notification (success or failure)
```
## 仓库结构
```
news_sphere/
├── .jenkins/
│ ├── Jenkinsfile.ci # CI pipeline
│ └── Jenkinsfile.cd # CD pipeline
├── frontend/ # React + Vite application
├── backend/ # Node.js + Express API
├── terraform/ # AWS infrastructure
│ └── playbooks/
│ └── roles/config/tasks/ # Ansible tasks (all tooling installation)
├── remote-infa/ # Terraform remote state backend
├── k8s/
│ └── prod-deployment/ # Production manifests (kustomize)
├── argocd-config/ # ArgoCD Application definition
├── vars/ # Jenkins shared library Groovy scripts
└── docker-compose.yml # Local development compose stack
```
## 快速开始
### 1. 前置条件
- 配置了 `ap-south-1` 访问权限的 AWS CLI
- Terraform ≥ 5.0
- 本地安装了 Ansible
- 已生成 SSH 密钥对(`news-sphere-ec2` / `news-sphere-ec2.pub`)
### 2. 准备远程状态(仅限首次)
```
cd remote-infa/
terraform init
terraform apply
```
### 3. 提供 EC2 + 使用 Ansible 进行配置
```
cd terraform/
terraform init
terraform apply
# Terraform 将会:
# 1. 创建 VPC、subnet、IGW、security group、EC2
# 2. 生成 hosts.ini inventory
# 3. 等待 SSH 准备就绪
# 4. 运行:ansible-playbook -i hosts.ini playbooks/config.yml
```
Ansible playbook 会自动安装 Docker、Jenkins、Minikube、所有安全工具以及所有 Helm charts。这大约需要 15–20 分钟。
### 4. 获取 EC2 IP
```
terraform output SERVER_IP
```
### 5. 配置 Jenkins
打开 `http://:8080` 并配置:
- Docker Hub 凭证(`docker-registry-credentials-id`)
- GitHub token(`github-token`)
- SonarQube token(`sonar-token-id`)和服务器 URL(`SONAR_SERVER_URL`)
- Vault root token(`vault-root-token`)
- MongoDB URL(`mongo-url`)、Redis URL(`redis-url`)、API key(`api-key`)
- 电子邮件凭证(`EMAIL`)、服务器 URL(`server-url`)、EC2 IP(`ip`)
将 `local-shared-library` 指向此仓库,以便 Jenkins 可以从 `vars/` 加载共享库。
## 许可证
请参阅 [LICENCE](./LICENCE)。
标签:DevSecOps, GitOps, MERN架构, MITM代理, 上游代理, 子域名突变, 搜索引擎查询, 新闻聚合平台, 系统提示词, 自定义脚本, 自定义请求头, 请求拦截