nkds

导航

 

MonkeyCode 企业级部署:从单机到集群的完整架构方案与最佳实践

引言

"开源不等于简单,企业级部署需要专业的架构设计。"

MonkeyCode 作为开源 AI 编程助手,不仅支持个人开发者使用,更具备强大的企业级部署能力。本文将为你详细介绍如何从零开始构建一套高可用、高性能、安全可控的 MonkeyCode 企业级部署方案——涵盖单机部署、多节点集群、负载均衡、监控告警、数据安全等核心主题。

无论你是为 10 人小团队搭建开发环境,还是为千人规模企业提供统一 AI 编程平台,这篇指南都能提供完整的参考。

🎯 核心信息


一、部署架构总览

1.1 推荐架构拓扑

┌─────────────────────────────────────────────────────────────────────┐
│                    MonkeyCode 企业级部署架构                          │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   ┌──────────┐    ┌──────────┐    ┌──────────┐                     │
│   │  用户端   │    │  用户端   │    │  用户端   │                     │
│   │ (IDE插件) │    │ (Web界面) │    │ (CLI工具) │                     │
│   └─────┬─────┘    └─────┬─────┘    └─────┬─────┘                     │
│         │               │               │                           │
│         └───────────────┼───────────────┘                           │
│                         ▼                                           │
│              ┌──────────────────┐                                   │
│              │   负载均衡 (LB)   │  Nginx / HAProxy / ALB            │
│              └────────┬─────────┘                                   │
│                       │                                             │
│        ┌──────────────┼──────────────┐                              │
│        ▼              ▼              ▼                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐                          │
│  │ API 节点1 │  │ API 节点2 │  │ API 节点3 │  水平扩展               │
│  │(MonkeyCode)│  │(MonkeyCode)│  │(MonkeyCode)│                          │
│  └─────┬─────┘  └─────┬─────┘  └─────┬─────┘                          │
│        │              │              │                               │
│        └──────────────┼──────────────┘                               │
│                       ▼                                             │
│     ┌───────────────────────────────┐                                │
│     │       共享存储层                │                                │
│     │  Redis + PostgreSQL + MinIO   │                                │
│     └───────────────────────────────┘                                │
│                       │                                             │
│        ┌──────────────┼──────────────┐                              │
│        ▼              ▼              ▼                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐                          │
│  │ LLM 网关  │  │ 本地模型  │  │ 外部API  │  多模型支持              │
│  │(ModelHub) │  │(Ollama)  │  │(OpenAI)  │                          │
│  └──────────┘  └──────────┘  └──────────┘                          │
│                                                                     │
│     ┌───────────────────────────────┐                                │
│     │      监控 & 日志 & 告警        │                                │
│     │ Prometheus + Grafana + ELK    │                                │
│     └───────────────────────────────┘                                │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

1.2 部署模式对比

部署模式 适用场景 节点数 高可用 复杂度 成本
单机 Docker 个人/小团队(<10人) 1
单机 Compose 中型团队(10-50人) 1+DB ⚠️ ⭐⭐
多节点集群 大型企业(50-500人) 3+ ⭐⭐⭐ 中高
Kubernetes 超大规模(500+人) N ✅✅ ⭐⭐⭐⭐
混合云 跨地域/合规要求 分布式 ✅✅ ⭐⭐⭐⭐⭐ 很高

二、Level 1:单机快速部署(30 分钟搞定)

2.1 Docker 单容器部署

# ===== 最简部署(适合体验和测试)=====

# 拉取最新镜像
docker pull monkeycode/server:latest

# 启动服务
docker run -d \
  --name monkeycode \
  -p 8080:8080 \
  -e MONKEYCODE_API_KEY="your-api-key-here" \
  -e MONKEYCODE_MODEL_PROVIDER="openai" \
  -e OPENAI_API_KEY="sk-your-openai-key" \
  -v monkeycode-data:/app/data \
  --restart unless-stopped \
  monkeycode/server:latest

# 验证运行状态
curl http://localhost:8080/api/health

# 预期输出:
# {"status":"healthy","version":"4.2.1","uptime":42}

2.2 Docker Compose 完整部署(推荐)

# docker-compose.yml —— 生产就绪的单机部署配置

version: '3.8'

services:
  # ========== MonkeyCode 主服务 ==========
  monkeycode:
    image: monkeycode/server:latest
    container_name: monkeycode-app
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      # 基础配置
      - NODE_ENV=production
      - PORT=8080
      - MONKEYCODE_API_KEY=${MONKEYCODE_API_KEY}
      
      # 数据库连接
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/monkeycode
      
      # Redis 缓存
      - REDIS_URL=redis://redis:6379
      
      # 模型配置
      - MONKEYCODE_MODEL_PROVIDER=openai
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1}
      
      # 安全配置
      - JWT_SECRET=${JWT_SECRET}
      - RATE_LIMIT_ENABLED=true
      - RATE_LIMIT_WINDOW_MS=60000
      - RATE_LIMIT_MAX_REQUESTS=100
      
      # 日志级别
      - LOG_LEVEL=info
    volumes:
      - monkeycode-uploads:/app/uploads
      - monkeycode-config:/app/config
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - monkeycode-net
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  # ========== PostgreSQL 数据库 ==========
  postgres:
    image: postgres:16-alpine
    container_name: monkeycode-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-monkeycode}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme123}
      POSTGRES_DB: monkeycode
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    ports:
      - "5432:5432"
    networks:
      - monkeycode-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-monkeycode}"]
      interval: 10s
      timeout: 5s
      retries: 5

  # ========== Redis 缓存 ==========
  redis:
    image: redis:7-alpine
    container_name: monkeycode-redis
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD:-redis123} --maxmemory 256mb --maxmemory-policy allkeys-lru
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    networks:
      - monkeycode-net
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-redis123}", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  # ========== Nginx 反向代理 ==========
  nginx:
    image: nginx:alpine
    container_name: monkeycode-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
      - nginx-logs:/var/log/nginx
    depends_on:
      - monkeycode
    networks:
      - monkeycode-net

volumes:
  postgres-data:
  redis-data:
  monkeycode-uploads:
  monkeycode-config:
  nginx-logs:

networks:
  monkeycode-net:
    driver: bridge

2.3 环境变量配置文件

# .env —— 敏感信息配置(不要提交到 Git!)

# ===== MonkeyCode 核心配置 =====
MONKEYCODE_API_KEY=mc-sk-$(openssl rand -hex 32)

# ===== 数据库配置 =====
POSTGRES_USER=monkeycode
POSTGRES_PASSWORD=$(openssl rand -base64 24)  # 自动生成强密码

# ===== Redis 配置 =====
REDIS_PASSWORD=$(openssl rand -base64 16)

# ===== OpenAI / 兼容 API 配置 =====
OPENAI_API_KEY=sk-your-key-here
# 如使用 Azure OpenAI 或其他兼容接口:
# OPENAI_BASE_URL=https://your-resource.openai.azure.com/openai/deployments/your-deployment

# ===== JWT 安全密钥 =====
JWT_SECRET=$(openssl rand -hex 64)

# ===== 可选:本地模型配置 =====
# LOCAL_MODEL_ENABLED=true
# OLLAMA_BASE_URL=http://host.docker.internal:11434

2.4 Nginx 配置

# nginx.conf —— 生产级 Nginx 配置

upstream monkeycode_backend {
    server monkeycode:8080;
    # 多节点时添加更多 server
    # server monkeycode-2:8080;
    # server monkeycode-3:8080;
}

server {
    listen 80;
    server_name monkeycode.yourcompany.com;
    
    # 强制 HTTPS(生产环境推荐)
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name monkeycode.yourcompany.com;

    # SSL 证书配置
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # 安全头
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    # 客户端请求大小限制(支持大代码文件上传)
    client_max_body_size 50m;

    # 请求超时设置
    proxy_connect_timeout 60s;
    proxy_send_timeout 300s;   # AI 补全可能需要较长时间
    proxy_read_timeout 300s;

    location / {
        proxy_pass http://monkeycode_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket 支持(实时补全)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        proxy_pass http://monkeycode_backend;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 健康检查端点(无需认证)
    location /api/health {
        proxy_pass http://monkeycode_backend;
        access_log off;
    }
}

三、Level 2:多节点集群部署(企业标配)

3.1 集群架构设计要点

┌─────────────────────────────────────────────────────────────────┐
│                   集群部署关键组件                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. 负载均衡层                                                   │
│     ├── Nginx / HAProxy(L4/L7 负载均衡)                        │
│     ├── 健康检查与自动摘除                                        │
│     ├── SSL 终止                                                │
│     └── 会话保持(Sticky Session)或无状态设计                     │
│                                                                 │
│  2. 应用层                                                       │
│     ├── 3+ MonkeyCode 实例(水平扩展)                            │
│     ├── 无状态设计(Session 存储在 Redis)                         │
│     ├── 统一配置中心(环境变量或 ConfigMap)                        │
│     └── 优雅启停(Graceful Shutdown)                             │
│                                                                 │
│  3. 数据层                                                       │
│     ├── PostgreSQL 主从复制(读写分离)                            │
│     ├── Redis Cluster(高可用缓存)                               │
│     ├── 对象存储(MinIO/S3)用于文件上传                           │
│     └── 定期备份策略                                             │
│                                                                 │
│  4. 观测性                                                       │
│     ├── Prometheus 指标采集                                       │
│     ├── Grafana 可视化看板                                        │
│     ├── ELK 日志聚合                                            │
│     └── AlertManager 告警通知                                    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

3.2 多节点 Compose 配置

# docker-compose.cluster.yml —— 3 节点集群部署

version: '3.8'

services:
  # ========== 负载均衡 ==========
  lb:
    image: haproxy:2.8-alpine
    container_name: monkeycode-lb
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "8404:8404"  # HAProxy Stats
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
      - ./ssl:/etc/haproxy/ssl:ro
    depends_on:
      - app-1
      - app-2
      - app-3
    networks:
      - monkeycode-net

  # ========== 应用节点 1 ==========
  app-1:
    image: monkeycode/server:latest
    container_name: monkeycode-app-1
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - NODE_ID=node-1
      - PORT=8080
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres-master:5432/monkeycode
      - REDIS_URL=redis://:${REDIS_PASSWORD}@redis-cluster:6379
      - MONKEYCODE_MODEL_PROVIDER=openai
      - OPENAI_API_KEY=${OPENAI_API_KEY}
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
        reservations:
          cpus: '2'
          memory: 4G
    networks:
      - monkeycode-net

  # ========== 应用节点 2 ==========
  app-2:
    image: monkeycode/server:latest
    container_name: monkeycode-app-2
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - NODE_ID=node-2
      - PORT=8080
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres-master:5432/monkeycode
      - REDIS_URL=redis://:${REDIS_PASSWORD}@redis-cluster:6379
      - MONKEYCODE_MODEL_PROVIDER=openai
      - OPENAI_API_KEY=${OPENAI_API_KEY}
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
    networks:
      - monkeycode-net

  # ========== 应用节点 3 ==========
  app-3:
    image: monkeycode/server:latest
    container_name: monkeycode-app-3
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - NODE_ID=node-3
      - PORT=8080
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres-master:5432/monkeycode
      - REDIS_URL=redis://:${REDIS_PASSWORD}@redis-cluster:6379
      - MONKEYCODE_MODEL_PROVIDER=openai
      - OPENAI_API_KEY=${OPENAI_API_KEY}
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
    networks:
      - monkeycode-net

  # ========== PostgreSQL 主库 ==========
  postgres-master:
    image: postgres:16-alpine
    container_name: monkeycode-pg-master
    restart: unless-stopped
    environment:
      POSTGRES_REPLICATION_MODE: master
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: monkeycode
    volumes:
      - pg-master-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - monkeycode-net

  # ========== PostgreSQL 从库(只读副本)==========
  postgres-replica:
    image: postgres:16-alpine
    container_name: monkeycode-pg-replica
    restart: unless-stopped
    environment:
      POSTGRES_REPLICATION_MODE: slave
      POSTGRES_MASTER_HOST: postgres-master
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: monkeycode
    volumes:
      - pg-replica-data:/var/lib/postgresql/data
    depends_on:
      - postgres-master
    networks:
      - monkeycode-net

  # ========== Redis Cluster ==========
  redis-cluster:
    image: redis:7-alpine
    container_name: monkeycode-redis
    restart: unless-stopped
    command: >
      redis-server
      --requirepass ${REDIS_PASSWORD}
      --maxmemory 512mb
      --maxmemory-policy allkeys-lru
      --appendonly yes
      --appendfsync everysec
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    networks:
      - monkeycode-net

volumes:
  pg-master-data:
  pg-replica-data:
  redis-data:

networks:
  monkeycode-net:
    driver: bridge

3.3 HAProxy 负载均衡配置

# haproxy.cfg —— HAProxy 负载均衡配置

global
    log stdout format raw local0 info
    maxconn 4096

defaults
    mode http
    log global
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 60000ms
    timeout server 300000ms  # AI 请求可能需要长时间等待

frontend http_front
    bind *:80
    # HTTP → HTTPS 重定向
    redirect scheme https code 301 if !{ ssl_fc }

frontend https_front
    bind *:443 ssl crt /etc/haproxy/ssl/monkeycode.pem alpn h2,http/1.1
    
    # 默认后端
    default_backend monkeycode_backend
    
    # 健康检查端点
    acl is_health_check path_beg /api/health
    use_backend health_backend if is_health_check

backend monkeycode_backend
    balance roundrobin  # 轮询策略
    option forwardfor
    http-request set-header X-Forwarded-Proto https
    
    # 应用节点定义
    server app-1 app-1:8080 check inter 5s fall 3 rise 2
    server app-2 app-2:8080 check inter 5s fall 3 rise 2
    server app-3 app-3:8080 check inter 5s fall 3 rise 2

backend health_backend
    server health localhost:8080

# HAProxy 统计页面(仅内网访问)
listen stats
    bind *:8404
    stats enable
    stats uri /
    stats refresh 10s
    stats admin if TRUE
    acl allowed_ip src 192.168.0.0/16 10.0.0.0/8
    http-request deny unless allowed_ip

四、Level 3:Kubernetes 部署(超大规模首选)

4.1 Kubernetes 资源清单

# k8s/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: monkeycode
  labels:
    app: monkeycode
    env: production
---
# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: monkeycode-config
  namespace: monkeycode
data:
  NODE_ENV: "production"
  PORT: "8080"
  LOG_LEVEL: "info"
  RATE_LIMIT_ENABLED: "true"
  RATE_LIMIT_MAX_REQUESTS: "100"
---
# k8s/secret.yaml(敏感信息用 Kubernetes Secret)
apiVersion: v1
kind: Secret
metadata:
  name: monkeycode-secrets
  namespace: monkeycode
type: Opaque
stringData:
  MONKEYCODE_API_KEY: "your-api-key"
  DATABASE_URL: "postgresql://user:pass@postgres-service:5432/monkeycode"
  REDIS_URL: "redis://:password@redis-service:6379"
  OPENAI_API_KEY: "sk-your-key"
  JWT_SECRET: "your-jwt-secret"
---
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monkeycode
  namespace: monkeycode
  labels:
    app: monkeycode
spec:
  replicas: 3  # 初始副本数,可通过 HPA 自动扩缩
  selector:
    matchLabels:
      app: monkeycode
  template:
    metadata:
      labels:
        app: monkeycode
    spec:
      containers:
      - name: monkeycode
        image: monkeycode/server:latest
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: monkeycode-config
        - secretRef:
            name: monkeycode-secrets
        resources:
          requests:
            cpu: "2"
            memory: "4Gi"
          limits:
            cpu: "4"
            memory: "8Gi"
        livenessProbe:
          httpGet:
            path: /api/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /api/health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        volumeMounts:
        - name: uploads
          mountPath: /app/uploads
      volumes:
      - name: uploads
        persistentVolumeClaim:
          claimName: monkeycode-uploads-pvc
---
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: monkeycode-service
  namespace: monkeycode
spec:
  selector:
    app: monkeycode
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP
---
# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: monkeycode-ingress
  namespace: monkeycode
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
spec:
  tls:
  - hosts:
    - monkeycode.yourcompany.com
    secretName: monkeycode-tls-secret
  rules:
  - host: monkeycode.yourcompany.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: monkeycode-service
            port:
              number: 80
---
# k8s/hpa.yaml —— 自动水平扩缩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: monkeycode-hpa
  namespace: monkeycode
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: monkeycode
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

4.2 一键部署脚本

#!/bin/bash
# deploy-k8s.sh —— MonkeyCode K8s 一键部署脚本

set -e

echo "🐵 开始部署 MonkeyCode 到 Kubernetes..."

# 1. 创建命名空间
kubectl apply -f k8s/namespace.yaml

# 2. 创建配置和密钥
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/secret.yaml

# 3. 部署持久化存储
kubectl apply -f k8s/pvc.yaml

# 4. 部署数据库和 Redis(如使用外部服务可跳过)
kubectl apply -f k8s/postgres.yaml
kubectl apply -f k8s/redis.yaml

# 5. 等待数据库就绪
echo "⏳ 等待数据库就绪..."
kubectl wait --for=condition=ready pod -l app=postgres -n monkeycode --timeout=120s

# 6. 部署主应用
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/ingress.yaml
kubectl apply -f k8s/hpa.yaml

# 7. 等待应用就绪
echo "⏳ 等待 MonkeyCode 就绪..."
kubectl rollout status deployment/monkeycode -n monkeycode --timeout=180s

# 8. 验证部署
echo ""
echo "✅ 部署完成!验证状态:"
echo ""
kubectl get pods -n monkeycode -l app=monkeycode
echo ""
kubectl get svc -n monkeycode
echo ""
kubectl get ingress -n monkeycode
echo ""
echo "🎉 MonkeyCode 已成功部署!"
echo "访问地址: https://monkeycode.yourcompany.com"

五、安全加固指南

5.1 必做安全措施

# security-checklist.yaml —— 企业安全配置清单

security_hardening:
  
  network_security:
    - item: "网络隔离"
      action: "使用独立 VPC/子网部署 MonkeyCode"
      priority: "P0"
    
    - item: "防火墙规则"
      action: "只开放必要端口(80/443),限制来源 IP"
      priority: "P0"
    
    - item: "内部 TLS"
      action: "服务间通信启用 mTLS"
      priority: "P1"

  authentication:
    - item: "强制 HTTPS"
      action: "Nginx 层面强制跳转 HTTPS"
      priority: "P0"
    
    - item: "API Key 管理"
      action: "使用强随机 Key,定期轮换"
      priority: "P0"
    
    - item: "SSO 集成"
      action: "集成 LDAP/OIDC/企业 SSO"
      priority: "P1"
    
    - item: "RBAC 权限控制"
      action: "基于角色的细粒度权限管理"
      priority: "P1"

  data_protection:
    - item: "敏感数据加密"
      action: "数据库字段加密(API Key、Token 等)"
      priority: "P0"
    
    - item: "传输加密"
      action: "TLS 1.2+,禁用弱密码套件"
      priority: "P0"
    
    - item: "备份加密"
      action: "备份数据使用 AES-256 加密"
      priority: "P1"
    
    - item: "日志脱敏"
      action: "日志中隐藏用户代码和 Token"
      priority: "P1"

  audit_compliance:
    - item: "操作审计日志"
      action: "记录所有 API 调用和用户操作"
      priority: "P0"
    
    - item: "代码审计"
      action: "记录发送给 AI 的代码内容(用于合规审查)"
      priority: "P1"
    
    - item: "定期安全扫描"
      action: "集成 SAST/DAST 工具进行自动化扫描"
      priority: "P1"

5.2 数据防泄露配置

// .monkeycode/security.js —— 自定义安全中间件

/**
 * 企业级数据安全配置
 * 
 * 功能:
 * 1. 代码内容过滤(防止敏感信息泄露)
 * 2. IP 白名单/黑名单
 * 3. 请求频率限制
 * 4. 审计日志记录
 */

module.exports = {
  // 敏感信息检测规则
  sensitivePatterns: [
    // 密钥和凭证
    /(?:api[_-]?key|apikey|secret[_-]?key)\s*[:=]\s*["'][\w-]{20,}["']/gi,
    /(?:password|passwd|pwd)\s*[:=]\s*["'][^"']{6,}["']/gi,
    // 私有 IP 和内网地址
    /(?:10\.|172\.(?:1[6-9]|2\d|3[01])\.|192\.168\.)\d+\.\d+/g,
    // 数据库连接串
    /(?:mongodb|mysql|postgres|redis):\/\/[^\s]+/gi,
  ],

  // IP 访问控制
  ipFilter: {
    enabled: true,
    whitelist: ['192.168.0.0/16', '10.0.0.0/8'],  // 内网白名单
    blacklist: [],  // 黑名单
  },

  // 审计日志配置
  auditLog: {
    enabled: true,
    level: 'info',
    fields: ['timestamp', 'userId', 'ip', 'action', 'resource'],
    excludeFields: ['codeContent', 'completionResult'],  // 不记录完整代码
  },

  // 数据保留策略
  dataRetention: {
    completionLogsDays: 30,    // 补全日志保留 30 天
    userActivityDays: 90,      // 用户活动日志保留 90 天
    auditLogsDays: 365,        // 审计日志保留 1 年
  }
};

六、监控运维体系

6.1 关键指标监控

# monitoring/metrics.yaml —— 监控指标定义

metrics:
  # ===== 业务指标 =====
  business:
    - name: "completion_requests_total"
      type: counter
      description: "补全请求总数"
      labels: ["model", "language", "status"]
    
    - name: "completion_latency_seconds"
      type: histogram
      description: "补全请求延迟分布"
      buckets: [0.1, 0.25, 0.5, 1, 2, 5, 10, 30]
    
    - name: "active_users gauge"
      type: gauge
      description: "当前活跃用户数"
    
    - name: "tokens_consumed_total"
      type: counter
      description: "Token 消耗总量"
      labels: ["model", "user_tier"]

  # ===== 系统指标 =====
  system:
    - name: "http_requests_total"
      type: counter
      description: "HTTP 请求总数"
      labels: ["method", "endpoint", "status"]
    
    - name: "database_query_duration_seconds"
      type: histogram
      description: "数据库查询耗时"
    
    - name: "cache_hit_rate"
      type: gauge
      description: "Redis 缓存命中率"
    
    - name: "error_rate"
      type: gauge
      description: "错误率(5xx/total)"

  # ===== 资源指标 =====
  resource:
    - name: "cpu_usage_percent"
      type: gauge
      description: "CPU 使用率"
    
    - name: "memory_usage_bytes"
      type: gauge
      description: "内存使用量"
    
    - name: "disk_usage_percent"
      type: gauge
      description: "磁盘使用率"
    
    - name: "goroutine_count"
      type: gauge
      description: "协程数量(Go 服务)"

6.2 Grafana 看板配置

{
  "dashboard": {
    "title": "MonkeyCode 运维看板",
    "panels": [
      {
        "title": "QPS 趋势",
        "type": "graph",
        "targets": [
          {
            "expr": "sum(rate(http_requests_total[5m])) by (endpoint)",
            "legendFormat": "{{endpoint}}"
          }
        ]
      },
      {
        "title": "P99 延迟",
        "type": "graph",
        "targets": [
          {
            "expr": "histogram_quantile(0.99, sum(rate(completion_latency_seconds_bucket[5m])) by (le))",
            "legendFormat": "P99"
          }
        ]
      },
      {
        "title": "错误率",
        "type": "singlestat",
        "targets": [
          {
            "expr": "sum(rate(http_requests_total{status=~\"5..\"}[5m])) / sum(rate(http_requests_total[5m])) * 100",
            "legendFormat": "Error Rate %"
          }
        ],
        "thresholds": [
          {"value": 1, "color": "green"},
          {"value": 5, "color": "yellow"},
          {"value": 10, "color": "red"}
        ]
      },
      {
        "title": "活跃用户数",
        "type": "graph",
        "targets": [
          {
            "expr": "active_users_gauge",
            "legendFormat": "Active Users"
          }
        ]
      },
      {
        "Title": "Token 消耗趋势",
        "type": "graph",
        "targets": [
          {
            "expr": "sum(increase(tokens_consumed_total[1h]))",
            "legendFormat": "Tokens/Hour"
          }
        ]
      }
    ]
  }
}

6.3 告警规则

# alerting/rules.yaml —— Prometheus 告警规则

groups:
- name: monkeycode-alerts
  rules:
  # ===== P0 级别:服务不可用 =====
  - alert: MonkeyCodeDown
    expr: up{job="monkeycode"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "MonkeyCode 服务宕机"
      description: "实例 {{ $labels.instance }} 已离线超过 1 分钟"

  # ===== P1 级别:性能退化 =====
  - alert: HighLatency
    expr: histogram_quantile(0.99, sum(rate(completion_latency_seconds_bucket[5m])) by (le)) > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "补全延迟过高"
      description: "P99 延迟已超过 10 秒,当前值: {{ $value }}s"

  - alert: HighErrorRate
    expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "错误率过高"
      description: "5xx 错误率超过 5%,当前值: {{ $value | humanizePercentage }}"

  # ===== P2 级别:资源预警 =====
  - alert: HighMemoryUsage
    expr: memory_usage_bytes / memory_limit_bytes > 0.85
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "内存使用率过高"
      description: "内存使用率达到 {{ $value | humanizePercentage }}"

  - alert: DiskSpaceLow
    expr: disk_usage_percent > 85
    for: 15m
    labels:
      severity: warning
    annotations:
      summary: "磁盘空间不足"
      description: "磁盘使用率达到 {{ $value }}%"

  # ===== P3 级别:业务异常 =====
  - alert: UnusualTraffic
    expr: sum(rate(http_requests_total[1h])) / sum(rate(http_requests_total[24h]) offset 1h) > 3
    for: 30m
    labels:
      severity: info
    annotations:
      summary: "流量异常增长"
      description: "当前流量是过去 24 小时均值的 {{ $value }} 倍"

七、成本优化策略

7.1 不同规模的成本估算

规模 部署方式 月成本估算(云资源) 说明
<10 人 单机 Docker ¥200-500 2C4G 云服务器
10-50 人 Compose 集群 ¥1,000-3,000 4C8G × 2 + RDS + Redis
50-200 人 K8s 集群 ¥5,000-15,000 多节点 + 托管 DB + 对象存储
200-1000 人 完整 K8s ¥20,000-50,000 高可用 + 专业运维
>1000 人 混合云 ¥50,000+ 定制化方案

7.2 成本优化技巧

# ===== 1. 本地模型降低 API 成本 =====
# 对于常见场景,使用本地模型替代云端 API
# 成本可降低 70-90%

# ===== 2. 智能缓存策略 =====
# 相似的补全请求直接返回缓存结果
# 缓存命中率可达 40-60%

# ===== 3. 弹性伸缩 =====
# 工作时间扩容,夜间缩容
# 可节省 30-50% 的计算资源

# ===== 4. Spot 实例 =====
# 无状态节点使用 Spot 实例
# 成本可降低 60-70%

# ===== 5. 预留实例 =====
# 稳定负载使用预留实例
# 相比按量付费节省 30-50%

八、故障排查速查表

问题现象 可能原因 排查命令 解决方法
服务启动失败 端口被占用 netstat -tlnp | grep 8080 更换端口或终止占用进程
连接数据库失败 密码错误/网络不通 docker logs monkeycode-db 检查 .env 配置和网络连通性
补全响应慢 模型排队/上下文过大 curl localhost:8080/api/metrics 减少上下文或增加节点
内存持续增长 内存泄漏 docker stats monkeycode 重启服务并升级版本
502 Bad Gateway 后端健康检查失败 curl localhost:8080/api/health 检查日志确认具体原因
WebSocket 断连 超时/Nginx 配置 查看 Nginx error.log 调整 proxy_timeout 参数

九、总结与建议

"好的架构不是设计出来的,是演进出来的。"

MonkeyCode 的企业级部署并不复杂,关键在于:

  1. 从小做起 — 先用 Docker Compose 跑通单机版,验证业务价值
  2. 逐步演进 — 根据团队规模和需求逐步升级架构
  3. 安全优先 — 从第一天就开始考虑安全和合规
  4. 观测先行 — 建立完善的监控体系,问题早发现早解决
  5. 成本意识 — 选择合适的部署模式,避免过度设计

现在就开始你的 MonkeyCode 企业部署之旅吧!

遇到问题?欢迎到 GitHub 提 Issue:
👉 https://github.com/monkeycode-ai/monkeycode/issues


本文由 MonkeyCode 社区原创,采用 Apache 2.0 许可证发布。

关键词: MonkeyCode 企业部署 Docker Kubernetes 集群 高可用 开源 DevOps

posted on 2026-06-25 12:40  MonkeyCode  阅读(15)  评论(0)    收藏  举报