# 风七六本地生活平台 - 自动流水线部署执行方案（优化整合版）

---

## 文档信息

| 项目       | 内容                          |
|----------|-----------------------------|
| **文档版本** | v2.1                        |
| **创建日期** | 2026-06-14                  |
| **适用环境** | 阿里云开发/测试/灰度预发/生产环境          |
| **核心原则** | 单机分时复用、最小成本、渐进式扩展、安全合规、质量左移 |
| **遵循标准** | 阿里开发手册、大厂DevOps最佳实践         |

---

## 一、方案概述

### 1.1 架构策略

采用 **"单机分时复用 + 渐进式扩展"** 策略：

| 阶段        | 资源配置              | 成本控制      |
|-----------|-------------------|-----------|
| **开发/测试** | 单台8核16G ECS       | 分时复用，最小成本 |
| **灰度预发**  | 现有服务器（资源限制）或最小ECS | 按需扩展      |
| **生产环境**  | 最小可用集群（2台4核8G）    | 弹性扩容      |

### 1.2 核心设计原则

| 原则     | 说明            | 项目适配                      |
|--------|---------------|---------------------------|
| 资源高效利用 | 单机分时运行，避免资源浪费 | 开发/测试/灰度预发共用单台ECS         |
| 安全合规   | 最小权限、网络隔离     | Jenkins/Nexus角色分级、KMS密钥管理 |
| 质量左移   | 开发阶段轻量检测      | pre-commit钩子、Dev环境代码检查    |
| 可观测性   | 完善的监控告警       | 全维度监控+钉钉告警                |
| 渐进式扩展  | 按需扩容，避免过度设计   | 生产独立最小集群                  |

### 1.3 域名资源规划（零额外成本）

| 主域名                 | 用途          |
|---------------------|-------------|
| `fengzhongxing.cn`  | 官网（独立服务器）   |
| `fengzhongxing.com` | 核心业务+DevOps |
| `fengqiliu.cn`      | 灾备/演示/灰度    |

---

## 二、网络架构设计

### 2.1 网络规划

| 网络名称             | 网段            | 用途             | 隔离方式   |
|------------------|---------------|----------------|--------|
| `fzx-devops-net` | 172.30.0.0/16 | 开发/测试/灰度预发容器内网 | VLAN隔离 |

### 2.2 安全组配置

| 端口     | 服务         | 访问限制             |
|--------|------------|------------------|
| 22     | SSH        | 仅办公网IP（精细化到具体IP） |
| 80/443 | HTTP/HTTPS | 公网访问             |
| 8080   | Jenkins    | 仅办公网IP           |
| 9000   | SonarQube  | 仅办公网IP           |
| 8091   | Nexus      | 仅办公网IP           |
| 8848   | Nacos      | 仅办公网IP           |

### 2.3 敏感信息管理规范

#### 2.3.1 环境变量文件管理

创建 `/root/fzx-dev/.env` 文件存储敏感信息，**禁止在脚本中硬编码密码、Token等敏感数据**：

```bash
# /root/fzx-dev/.env
DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN
DB_PASSWORD=your-database-password
NEXUS_ADMIN_PASSWORD=your-nexus-password
SONAR_ADMIN_PASSWORD=your-sonar-password
```

#### 2.3.2 文件权限收紧

```bash
chmod 600 /root/fzx-dev/.env
chown root:root /root/fzx-dev/.env
```

#### 2.3.3 脚本引用方式

```bash
#!/bin/bash
# 脚本开头引入环境变量
source /root/fzx-dev/.env

# 使用变量
curl -s -X POST $DINGTALK_WEBHOOK ...
```

### 2.4 中间件安全加固

| 中间件       | 加固措施                |
|-----------|---------------------|
| Nexus     | 关闭匿名访问，修改默认密码       |
| SonarQube | 关闭匿名浏览，配置角色权限       |
| Nacos     | 关闭匿名访问，启用认证         |
| Jenkins   | 配置LDAP/OAuth，最小权限原则 |

### 2.3 域名与反向代理配置

```nginx
# /etc/nginx/conf.d/fzx-dev.conf

upstream jenkins { server 172.30.0.2:8080; }
upstream sonarqube { server 172.30.0.3:9000; }
upstream nexus { server 172.30.0.4:8091; }
upstream api-dev { server 172.30.0.10:8080; }
upstream api-test { server 172.30.0.11:8080; }

server {
    listen 80;
    server_name jenkins-dev.fengzhongxing.com;
    allow 192.168.1.0/24;  # 精细化办公网IP段
    deny all;
    location / { proxy_pass http://jenkins; proxy_set_header Host $host; }
}

server {
    listen 80;
    server_name api-dev.fengzhongxing.com;
    location / { proxy_pass http://api-dev; proxy_set_header Host $host; }
}

server {
    listen 80;
    server_name api-test.fengzhongxing.com;
    location / { proxy_pass http://api-test; proxy_set_header Host $host; }
}
```

---

## 三、CI/CD效率优化

### 3.1 Maven依赖缓存配置

```groovy
pipeline {
    agent any

    options {
        cache(path: '~/.m2/repository',
              key: 'maven-${MD5SUM(pom.xml)}',
              restoreKeys: ['maven-'])
    }

    stages {
        stage('Build') {
            steps {
                sh "mvn clean package -DskipTests -Dmaven.repo.local=~/.m2/repository"
            }
        }
    }
}
```

### 3.2 Docker镜像分层缓存

```groovy
stage('Build & Push Image') {
    steps {
        script {
            def dockerImage = docker.build("fzx-platform:${IMAGE_TAG}",
                "--cache-from fzx-platform:latest .")
            dockerImage.push()
            dockerImage.push("latest")
        }
    }
}
```

### 3.3 流水线并行化

```groovy
stage('Parallel Tests') {
    parallel {
        stage('Unit Test') {
            steps { sh 'mvn test' }
        }
        stage('Code Quality') {
            steps { sh 'mvn checkstyle:check pmd:check' }
        }
    }
}
```

---

## 四、质量左移强化

### 4.1 pre-commit钩子配置

创建 `.pre-commit-config.yaml`：

```yaml
repos:
  - repo: https://github.com/pre-commit/mirrors-checkstyle
    rev: 'google_checks'
    hooks:
      - id: checkstyle
        args: ['-c', 'checkstyle/checkstyle.xml']

  - repo: https://github.com/Lucas-C/pre-commit-hooks
    rev: v1.1.10
    hooks:
      - id: remove-tabs
      - id: trailing-whitespace
```

### 4.2 钩子安装与使用

```bash
# 安装pre-commit
pip install pre-commit

# 安装钩子
pre-commit install

# 手动执行检查
pre-commit run --all-files
```

### 4.3 Git分支保护规范

#### 4.3.1 保护规则

| 分支            | 保护策略                       |
|---------------|----------------------------|
| `main/master` | 禁止直接推送，必须通过Merge Request合并 |
| `develop`     | 禁止直接推送，必须通过Merge Request合并 |
| `release/*`   | 仅允许Release Manager推送       |
| `hotfix/*`    | 仅允许紧急修复                    |

#### 4.3.2 合并前置条件

- ✅ 流水线代码检查通过
- ✅ 至少1人代码评审通过
- ✅ 单元测试覆盖率达标（≥80%）

---

## 五、监控告警体系

### 5.1 钉钉告警集成

```bash
#!/bin/bash
# /root/fzx-dev/scripts/health-check.sh

DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"

send_alert() {
    local message=$1
    curl -s -X POST $DINGTALK_WEBHOOK \
      -H 'Content-Type: application/json' \
      -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$message\"}}"
}

# 磁盘监控
DISK_USED=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
if [ $DISK_USED -gt 80 ]; then
    send_alert "【告警】开发服务器磁盘使用率超过80%！当前: ${DISK_USED}%"
fi

# Jenkins状态检查
JENKINS_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/login)
if [ "$JENKINS_STATUS" -ne 200 ]; then
    send_alert "【告警】Jenkins服务异常 (HTTP状态码: ${JENKINS_STATUS})"
fi
```

### 5.2 告警分级策略

| 级别     | 触发条件                  | 响应时间 |
|--------|-----------------------|------|
| P1（紧急） | Jenkins服务宕机、服务器磁盘>90% | 15分钟 |
| P2（重要） | 构建连续失败≥3次、证书有效期<7天    | 30分钟 |
| P3（一般） | 容器异常退出、资源使用率>80%      | 1小时  |

---

## 六、运维操作标准化

### 6.1 流水线化环境切换

```groovy
stage('Switch Environment') {
    parameters {
        string(name: 'TARGET_ENV', defaultValue: 'dev', description: '目标环境')
    }
    steps {
        script {
            echo "🔄 切换到 ${TARGET_ENV} 环境..."
            sh "/root/fzx-dev/scripts/switch-environment.sh ${TARGET_ENV}"

            // 记录操作日志
            writeFile file: 'environment-switch.log',
                text: "${BUILD_NUMBER},${TARGET_ENV},${BUILD_TIMESTAMP}"
        }
    }
}
```

### 6.2 环境切换脚本优化

```bash
#!/bin/bash
# /root/fzx-dev/scripts/switch-environment.sh
set -euo pipefail

ENVIRONMENT=$1
LOG_FILE="/root/fzx-dev/logs/env-switch.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

log "开始切换到 ${ENVIRONMENT} 环境"

# 验证环境参数
if [[ ! "$ENVIRONMENT" =~ ^(dev|test|pre)$ ]]; then
    log "无效的环境参数: $ENVIRONMENT"
    exit 1
fi

# 停止其他环境容器
log "停止所有应用容器"
APP_CONTAINERS=$(podman ps --filter "name=-dev" --filter "name=-test" --filter "name=-pre" -q)
if [ -n "$APP_CONTAINERS" ]; then
    podman stop $APP_CONTAINERS
    podman rm $APP_CONTAINERS
fi

# 启动目标环境
log "启动${ENVIRONMENT}环境"
podman-compose -f /root/fzx-dev/compose/docker-compose.${ENVIRONMENT}.yml up -d

# 资源限制（仅pre环境）
if [ "$ENVIRONMENT" = "pre" ]; then
    log "设置预发环境资源限制"
    PRE_CONTAINERS=$(podman ps --filter "name=pre" -q)
    for container in $PRE_CONTAINERS; do
        podman update --cpus 2.0 --memory 4G $container
    done
fi

log "${ENVIRONMENT}环境切换完成"
```

### 6.3 巡检闭环流程

```bash
#!/bin/bash
# /root/fzx-dev/scripts/inspection.sh
set -euo pipefail

INSPECTION_LOG="/root/fzx-dev/logs/inspection-$(date +%Y%m%d).log"

echo "=== 巡检开始 ===" >> $INSPECTION_LOG
echo "时间: $(date)" >> $INSPECTION_LOG

# CPU检查
CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}')
echo "CPU使用率: ${CPU_USAGE}%" >> $INSPECTION_LOG
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
    echo "⚠️ CPU使用率超过80%" >> $INSPECTION_LOG
fi

# 内存检查
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
echo "内存使用率: ${MEM_USAGE}%" >> $INSPECTION_LOG

# 容器状态检查
echo "=== 容器状态 ===" >> $INSPECTION_LOG
podman ps >> $INSPECTION_LOG

echo "=== 巡检结束 ===" >> $INSPECTION_LOG
```

### 6.4 备份验证与日志管理规范

#### 6.4.1 备份有效性校验

```bash
#!/bin/bash
# /root/fzx-dev/scripts/backup-verify.sh
set -euo pipefail

BACKUP_FILE="/root/fzx-dev/backups/fzx-backup-$(date +%Y%m%d).tar.gz"
MIN_SIZE=102400  # 最小100KB

# 检查备份文件存在
if [ ! -f "$BACKUP_FILE" ]; then
    echo "ERROR: 备份文件不存在"
    exit 1
fi

# 检查文件大小
FILE_SIZE=$(stat -c%s "$BACKUP_FILE")
if [ "$FILE_SIZE" -lt "$MIN_SIZE" ]; then
    echo "ERROR: 备份文件过小，可能为空备份"
    exit 1
fi

# 解压验证
tar -tzf "$BACKUP_FILE" > /dev/null || {
    echo "ERROR: 备份文件损坏"
    exit 1
}

# 自动清理7天前的备份
find /root/fzx-dev/backups/ -name "*.tar.gz" -mtime +7 -delete

echo "备份验证通过"
```

#### 6.4.2 日志按天切割与清理

```bash
#!/bin/bash
# /root/fzx-dev/scripts/log-rotate.sh
set -euo pipefail

LOG_DIR="/root/fzx-dev/logs"

# 按天切割日志
mv "${LOG_DIR}/env-switch.log" "${LOG_DIR}/env-switch-$(date -d 'yesterday' +%Y%m%d).log" || true
mv "${LOG_DIR}/health-check.log" "${LOG_DIR}/health-check-$(date -d 'yesterday' +%Y%m%d).log" || true

# 删除30天前的日志
find "$LOG_DIR" -name "*.log" -mtime +30 -delete
```

---

## 七、核心优化点与执行方案

### 7.1 灰度预发环境资源强化

```bash
# pre环境资源限制为开发环境的50%
podman update --cpus 2.0 --memory 4G $container
```

### 7.2 生产最小集群配置

| 资源类型    | 配置规格 | 数量 | 预估成本（月）      |
|---------|------|----|--------------|
| ECS实例   | 4核8G | 2台 | ~600元        |
| RDS数据库  | 2核4G | 1台 | ~300元        |
| SLB负载均衡 | 共享型  | 1台 | ~100元        |
| **总计**  | -    | -  | **~1000元/月** |

### 7.3 低成本优化选项

#### 7.3.1 OSS异地备份（月均3-5元）

开发环境备份数据量较小（几百MB级别），建议开通阿里云OSS标准存储进行异地备份：

```bash
#!/bin/bash
# /root/fzx-dev/scripts/backup-to-oss.sh
set -euo pipefail

BACKUP_FILE="/root/fzx-dev/backups/fzx-backup-$(date +%Y%m%d).tar.gz"
OSS_BUCKET="fzx-dev-backup"

# 加密备份
openssl enc -aes-256-cbc -salt -in "$BACKUP_FILE" -out "${BACKUP_FILE}.enc" -pass pass:"$BACKUP_PASSWORD"

# 上传到OSS
ossutil cp "${BACKUP_FILE}.enc" "oss://${OSS_BUCKET}/"

# 清理本地加密文件
rm "${BACKUP_FILE}.enc"
```

#### 7.3.2 HTTPS证书配置（零成本）

使用阿里云免费SSL证书，配置Nginx强制HTTPS：

```nginx
server {
    listen 80;
    server_name jenkins-dev.fengzhongxing.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name jenkins-dev.fengzhongxing.com;

    ssl_certificate /etc/nginx/certs/fengzhongxing.com.pem;
    ssl_certificate_key /etc/nginx/certs/fengzhongxing.com.key;

    location / {
        proxy_pass http://jenkins;
        proxy_set_header Host $host;
    }
}
```

### 7.4 镜像版本管控

| 环境   | Tag格式                     | 示例                            |
|------|---------------------------|-------------------------------|
| 开发   | `dev-<版本>-<日期>-<commit>`  | `dev-1.0.0-20260614-a1b2c3d`  |
| 测试   | `test-<版本>-<日期>-<commit>` | `test-1.0.0-20260614-a1b2c3d` |
| 灰度预发 | `pre-<版本>-<日期>-<commit>`  | `pre-1.0.0-20260614-a1b2c3d`  |
| 生产   | `<版本>`                    | `1.0.0`                       |

### 7.5 流水线回滚能力

```groovy
stage('Deploy') {
    steps {
        script {
            def currentVersion = sh(script: 'cat /root/fzx-dev/current-version.txt 2>/dev/null || echo ""', returnStdout: true).trim()

            try {
                sh "/root/fzx-dev/scripts/switch-environment.sh ${ENVIRONMENT}"
                def verifyResult = sh(script: "/root/fzx-dev/scripts/post-deploy-verify.sh ${ENVIRONMENT}", returnStatus: true)
                if (verifyResult != 0) {
                    error "部署验证失败"
                }
            } catch (Exception e) {
                if (currentVersion) {
                    echo "回滚到版本: ${currentVersion}"
                    sh "docker-compose -f /root/fzx-dev/compose/docker-compose.${ENVIRONMENT}.yml down"
                    sh "docker-compose -f /root/fzx-dev/compose/docker-compose.${ENVIRONMENT}.yml up -d --no-build"
                }
                throw e
            }
        }
    }
}
```

---

## 八、落地路线图

### 第一阶段：开发/测试环境（当前）

1. ✅ Maven依赖缓存配置
2. ✅ Docker镜像分层缓存
3. ✅ pre-commit钩子配置
4. ✅ 钉钉告警触达
5. ✅ 流水线化环境切换
6. ✅ 巡检闭环流程
7. ✅ 敏感信息.env管理
8. ✅ 脚本容错配置（set -euo pipefail）
9. ✅ Git分支保护规范
10. ✅ 备份有效性校验
11. ✅ 日志按天切割

### 第二阶段：灰度预发环境（测试完成后）

1. ⬜ 敏感配置KMS加密
2. ⬜ 镜像漏洞扫描
3. ⬜ OSS异地备份（低成本）
4. ⬜ HTTPS证书配置

### 第三阶段：生产环境（业务稳定后）

1. ⬜ 跨可用区部署
2. ⬜ RDS主备实例
3. ⬜ 金丝雀发布

### 第四阶段：持续优化（长期）

1. ⬜ Prometheus+Grafana监控
2. ⬜ Terraform基础设施即代码
3. ⬜ 灾备演练常态化

---

## 附录：命令速查

```bash
# 环境切换
/root/fzx-dev/scripts/switch-environment.sh dev/test/pre

# 备份操作
/root/fzx-dev/scripts/backup-all.sh

# 备份验证
/root/fzx-dev/scripts/backup-verify.sh

# 备份上传OSS
/root/fzx-dev/scripts/backup-to-oss.sh

# 健康检查（含告警）
/root/fzx-dev/scripts/health-check.sh

# 巡检执行
/root/fzx-dev/scripts/inspection.sh

# 日志切割
/root/fzx-dev/scripts/log-rotate.sh

# pre-commit检查
pre-commit run --all-files

# 敏感信息文件权限设置
chmod 600 /root/fzx-dev/.env && chown root:root /root/fzx-dev/.env
```

---

**文档版本**: v2.2
**创建日期**: 2026-06-14
**适用环境**: 阿里云开发/测试/灰度预发/生产环境
**遵循标准**: 阿里开发手册、大厂DevOps最佳实践

---

> 注：本方案整合了分析建议中当前阶段可落地的优化项，重点提升CI/CD效率、质量左移、监控告警、安全合规和运维标准化能力，零成本优化项已全部纳入第一阶段落地内容。
