CoPaw 部署指南

CoPaw 部署指南

本教程将详细介绍如何在不同环境中部署 CoPaw,包括开发环境、测试环境和生产环境。我们将使用 Docker、Kubernetes 和云服务等多种部署方式。

部署环境准备

系统要求

| 组件 | 最低要求 | 推荐配置 |
|------|---------|---------|
| 操作系统 | Linux/Windows/macOS | Ubuntu 22.04 LTS |
| Python | 3.8+ | 3.10+ |
| 内存 | 512MB | 2GB+ |
| 存储 | 1GB | 10GB+ |
| 网络 | 稳定连接 | 高速网络 |

依赖安装

# 安装 Python 3.10
sudo apt update
sudo apt install python3.10 python3-pip python3-venv

# 安装系统依赖
sudo apt install git curl wget build-essential

# 安装 Docker(可选)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

Docker 部署

Dockerfile

创建 Dockerfile:

FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 安装 CoPaw
RUN pip install --no-cache-dir copaw

# 复制配置文件
COPY config.json /root/.copaw/

# 创建数据目录
RUN mkdir -p /data/copaw

# 设置环境变量
ENV COPAW_DATA_DIR=/data/copaw
ENV COPAW_CONFIG=/root/.copaw/config.json

# 暴露端口(如果使用 HTTP API)
EXPOSE 8080

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
  CMD copaw health

# 启动 CoPaw
CMD ["copaw", "server"]

Docker Compose

创建 docker-compose.yml:

version: '3.8'

services:
  copaw:
    build: .
    container_name: copaw
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./config.json:/root/.copaw/config.json:ro
      - ./data:/data/copaw
      - ./logs:/var/log/copaw
    environment:
      - COPAW_ENV=prod
      - TZ=Asia/Shanghai
    networks:
      - copaw-network
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:15-alpine
    container_name: copaw-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=copaw
      - POSTGRES_USER=copaw
      - POSTGRES_PASSWORD=yourpassword
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - copaw-network

  redis:
    image: redis:7-alpine
    container_name: copaw-redis
    restart: unless-stopped
    volumes:
      - redis-data:/data
    networks:
      - copaw-network

networks:
  copaw-network:
    driver: bridge

volumes:
  postgres-data:
  redis-data:

构建和启动

# 构建镜像
docker-compose build

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f copaw

# 停止服务
docker-compose down

生产环境配置

创建 config.prod.json:

{
  "environment": "prod",
  "logging": {
    "level": "warn",
    "file": "/var/log/copaw/copaw.log"
  },
  "memory": {
    "storage_path": "/data/copaw/memory",
    "backup_enabled": true,
    "backup_path": "/data/copaw/backups"
  },
  "cron": {
    "enabled": true,
    "timezone": "Asia/Shanghai",
    "max_concurrent_tasks": 10
  },
  "security": {
    "enable_auth": true,
    "rate_limit": 1000
  }
}

Kubernetes 部署

Deployment 配置

创建 deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: copaw
  namespace: copaw
spec:
  replicas: 3
  selector:
    matchLabels:
      app: copaw
  template:
    metadata:
      labels:
        app: copaw
    spec:
      containers:
      - name: copaw
        image: copaw:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: COPAW_ENV
          value: "prod"
        - name: TZ
          value: "Asia/Shanghai"
        volumeMounts:
        - name: config
          mountPath: /root/.copaw/config.json
          subPath: config.json
        - name: data
          mountPath: /data/copaw
        - name: logs
          mountPath: /var/log/copaw
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "2Gi"
            cpu: "1000m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: config
        configMap:
          name: copaw-config
      - name: data
        persistentVolumeClaim:
          claimName: copaw-data
      - name: logs
        persistentVolumeClaim:
          claimName: copaw-logs

Service 配置

创建 service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: copaw
  namespace: copaw
spec:
  selector:
    app: copaw
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer

ConfigMap 配置

创建 configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: copaw-config
  namespace: copaw
data:
  config.json: |
    {
      "environment": "prod",
      "logging": {
        "level": "warn"
      },
      "channels": {
        "slack": {
          "enabled": true,
          "bot_token": "${SLACK_BOT_TOKEN}"
        }
      }
    }

PersistentVolume 配置

创建 pv.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: copaw-data
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: copaw-data
  namespace: copaw
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard

部署到 Kubernetes

# 创建命名空间
kubectl create namespace copaw

# 部署所有资源
kubectl apply -f namespace.yaml
kubectl apply -f configmap.yaml
kubectl apply -f pv.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# 查看状态
kubectl get pods -n copaw
kubectl get svc -n copaw

# 查看日志
kubectl logs -f deployment/copaw -n copaw

# 扩缩容
kubectl scale deployment copaw --replicas=5 -n copaw

# 更新部署
kubectl set image deployment/copaw copaw=copaw:v2.0 -n copaw

云服务部署

AWS 部署

EC2 部署

# 创建 EC2 实例
aws ec2 run-instances \
  --image-id ami-0c55b159cbfafe1f0 \
  --instance-type t3.medium \
  --key-name my-key \
  --security-group-ids sg-xxxxxxxx \
  --user-data file://user-data.sh

# user-data.sh
#!/bin/bash
apt update
apt install -y python3.10 docker.io
systemctl enable docker
systemctl start docker
docker run -d -p 8080:8080 copaw:latest

ECS 部署

创建 ecs-task-definition.json:

{
  "family": "copaw",
  "containerDefinitions": [
    {
      "name": "copaw",
      "image": "copaw:latest",
      "memory": 2048,
      "cpu": 512,
      "portMappings": [
        {
          "containerPort": 8080,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "COPAW_ENV",
          "value": "prod"
        }
      ]
    }
  ]
}
# 注册任务定义
aws ecs register-task-definition --cli-input-json file://ecs-task-definition.json

# 创建服务
aws ecs create-service \
  --cluster copaw-cluster \
  --service-name copaw \
  --task-definition copaw:1 \
  --desired-count 3

Google Cloud 部署

Cloud Run 部署

# 构建并推送镜像
gcloud builds submit --tag gcr.io/PROJECT-ID/copaw

# 部署到 Cloud Run
gcloud run deploy copaw \
  --image gcr.io/PROJECT-ID/copaw \
  --platform managed \
  --region asia-east1 \
  --allow-unauthenticated \
  --memory 2Gi \
  --cpu 1 \
  --max-instances 10

GKE 部署

# 创建集群
gcloud container clusters create copaw \
  --zone asia-east1-a \
  --num-nodes 3 \
  --machine-type e2-medium

# 部署
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Azure 部署

Azure Container Instances

# 创建容器实例
az container create \
  --resource-group copaw-rg \
  --name copaw \
  --image copaw:latest \
  --cpu 1 \
  --memory 2 \
  --ports 8080 \
  --environment-variables COPAW_ENV=prod

Azure Kubernetes Service

# 创建 AKS 集群
az aks create \
  --resource-group copaw-rg \
  --name copaw-aks \
  --node-count 3 \
  --node-vm-size Standard_B2s

# 获取凭证
az aks get-credentials --resource-group copaw-rg --name copaw-aks

# 部署
kubectl apply -f deployment.yaml

监控和日志

Prometheus 监控

创建 prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'copaw'
    static_configs:
      - targets: ['copaw:8080']
    metrics_path: /metrics
# 部署 Prometheus
docker run -d -p 9090:9090 \
  -v prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

Grafana 可视化

创建 grafana-dashboard.json:

{
  "dashboard": {
    "title": "CoPaw Dashboard",
    "panels": [
      {
        "title": "请求率",
        "type": "graph",
        "targets": [
          {
            "expr": "rate(http_requests_total[5m])"
          }
        ]
      },
      {
        "title": "内存使用",
        "type": "graph",
        "targets": [
          {
            "expr": "container_memory_usage_bytes"
          }
        ]
      }
    ]
  }
}

日志聚合

# logstash.conf
input {
  file {
    path => "/var/log/copaw/*.log"
    type => "copaw"
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "copaw-%{+YYYY.MM.dd}"
  }
}

备份和恢复

数据备份

# Memory 备份
/memory backup --output backups/memory_$(date +%Y%m%d).zip

# 配置备份
/config backup --output backups/config_$(date +%Y%m%d).json

# 完整备份
/backup create --output backups/full_$(date +%Y%m%d).tar.gz

自动备份

# 每日自动备份
/cron add 每日备份 \
  --schedule "0 2 * * *" \
  --command "/backup create --output /backups/full_$(date +\%Y\%m\%d).tar.gz"

# 保留最近 7 天的备份
/cron add 清理备份 \
  --schedule "0 3 * * *" \
  --command "/trash remove /backups/full_*.tar.gz --older-than 7days"

恢复数据

# 恢复 Memory
/memory restore --input backups/memory_20240115.zip

# 恢复配置
/config restore --input backups/config_20240115.json

# 完整恢复
/backup restore --input backups/full_20240115.tar.gz

高可用部署

负载均衡

# nginx.conf
upstream copaw {
    least_conn;
    server copaw-1:8080;
    server copaw-2:8080;
    server copaw-3:8080;
}

server {
    listen 80;
    server_name copaw.example.com;

    location / {
        proxy_pass http://copaw;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

故障转移

# Kubernetes 自动故障转移
# Deployment 会自动重启失败的 Pod

# 使用 Readiness Probe 确保只有健康的 Pod 接收流量
readinessProbe:
  httpGet:
    path: /ready
    port: 8080

安全配置

TLS/SSL

# 生成 SSL 证书
openssl req -x509 -newkey rsa:4096 \
  -keyout key.pem -out cert.pem \
  -days 365 -nodes \
  -subj "/CN=copaw.example.com"

# 配置 Nginx
server {
    listen 443 ssl;
    server_name copaw.example.com;

    ssl_certificate /etc/ssl/certs/cert.pem;
    ssl_certificate_key /etc/ssl/private/key.pem;

    location / {
        proxy_pass http://copaw;
    }
}

防火墙

# UFW 防火墙
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# AWS Security Group
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxx \
  --protocol tcp \
  --port 80 \
  --cidr 0.0.0.0/0

性能调优

资源限制

# Kubernetes 资源限制
resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "2Gi"
    cpu: "1000m"

缓存配置

{
  "cache": {
    "enabled": true,
    "type": "redis",
    "host": "redis",
    "port": 6379,
    "ttl": 3600
  }
}

总结

通过本教程,你应该已经掌握了:

  • ✅ Docker 部署
  • ✅ Docker Compose 部署
  • ✅ Kubernetes 部署
  • ✅ 云服务部署(AWS、GCP、Azure)
  • ✅ 监控和日志
  • ✅ 备份和恢复
  • ✅ 高可用部署
  • ✅ 安全配置
  • ✅ 性能调优

下一章

在下一章中,我们将学习 CoPaw 实战案例,通过实际项目展示 CoPaw 的应用。

相关资源

发表回复

后才能评论