477 lines
9.5 KiB
Markdown
477 lines
9.5 KiB
Markdown
# 🚀 部署指南
|
||
|
||
## Docker 部署
|
||
|
||
### 1. 构建镜像
|
||
|
||
```bash
|
||
# 构建生产镜像
|
||
make docker-build
|
||
|
||
# 或使用Docker命令
|
||
docker build -t tyapi-server:latest .
|
||
```
|
||
|
||
### 2. 运行容器
|
||
|
||
```bash
|
||
# 单容器运行
|
||
docker run -d \
|
||
--name tyapi-server \
|
||
-p 8080:8080 \
|
||
-e APP_ENV=production \
|
||
-e DB_HOST=your-db-host \
|
||
-e DB_PASSWORD=your-password \
|
||
tyapi-server:latest
|
||
|
||
# 使用Docker Compose
|
||
docker-compose up -d
|
||
```
|
||
|
||
### 3. 多环境部署
|
||
|
||
#### 开发环境
|
||
|
||
```bash
|
||
# 启动完整开发环境
|
||
docker-compose -f docker-compose.dev.yml up -d
|
||
|
||
# 仅启动依赖服务
|
||
docker-compose -f docker-compose.dev.yml up -d postgres redis
|
||
```
|
||
|
||
#### 测试环境
|
||
|
||
```bash
|
||
# 使用测试配置
|
||
docker-compose -f docker-compose.test.yml up -d
|
||
```
|
||
|
||
#### 生产环境
|
||
|
||
```bash
|
||
# 使用生产配置
|
||
docker-compose -f docker-compose.prod.yml up -d
|
||
```
|
||
|
||
## Kubernetes 部署
|
||
|
||
### 1. 配置清单文件
|
||
|
||
创建 `k8s/deployment.yaml`:
|
||
|
||
```yaml
|
||
apiVersion: apps/v1
|
||
kind: Deployment
|
||
metadata:
|
||
name: tyapi-server
|
||
spec:
|
||
replicas: 3
|
||
selector:
|
||
matchLabels:
|
||
app: tyapi-server
|
||
template:
|
||
metadata:
|
||
labels:
|
||
app: tyapi-server
|
||
spec:
|
||
containers:
|
||
- name: tyapi-server
|
||
image: tyapi-server:latest
|
||
ports:
|
||
- containerPort: 8080
|
||
env:
|
||
- name: APP_ENV
|
||
value: "production"
|
||
- name: DB_HOST
|
||
valueFrom:
|
||
secretKeyRef:
|
||
name: tyapi-secrets
|
||
key: db-host
|
||
```
|
||
|
||
### 2. 服务配置
|
||
|
||
创建 `k8s/service.yaml`:
|
||
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: tyapi-server-service
|
||
spec:
|
||
selector:
|
||
app: tyapi-server
|
||
ports:
|
||
- protocol: TCP
|
||
port: 80
|
||
targetPort: 8080
|
||
type: LoadBalancer
|
||
```
|
||
|
||
### 3. 配置管理
|
||
|
||
创建 `k8s/configmap.yaml`:
|
||
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: ConfigMap
|
||
metadata:
|
||
name: tyapi-config
|
||
data:
|
||
config.yaml: |
|
||
server:
|
||
port: 8080
|
||
mode: release
|
||
database:
|
||
host: postgres-service
|
||
port: 5432
|
||
```
|
||
|
||
### 4. 密钥管理
|
||
|
||
```bash
|
||
# 创建密钥
|
||
kubectl create secret generic tyapi-secrets \
|
||
--from-literal=db-password=your-db-password \
|
||
--from-literal=jwt-secret=your-jwt-secret
|
||
```
|
||
|
||
### 5. 部署到集群
|
||
|
||
```bash
|
||
# 应用所有配置
|
||
kubectl apply -f k8s/
|
||
|
||
# 查看部署状态
|
||
kubectl get pods -l app=tyapi-server
|
||
|
||
# 查看服务状态
|
||
kubectl get services
|
||
|
||
# 查看服务日志
|
||
kubectl logs -f deployment/tyapi-server
|
||
```
|
||
|
||
## 云平台部署
|
||
|
||
### AWS ECS
|
||
|
||
#### 1. 推送镜像到 ECR
|
||
|
||
```bash
|
||
# 登录 ECR
|
||
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin <account>.dkr.ecr.us-west-2.amazonaws.com
|
||
|
||
# 标记镜像
|
||
docker tag tyapi-server:latest <account>.dkr.ecr.us-west-2.amazonaws.com/tyapi-server:latest
|
||
|
||
# 推送镜像
|
||
docker push <account>.dkr.ecr.us-west-2.amazonaws.com/tyapi-server:latest
|
||
```
|
||
|
||
#### 2. 创建任务定义
|
||
|
||
```json
|
||
{
|
||
"family": "tyapi-server",
|
||
"networkMode": "awsvpc",
|
||
"requiresCompatibilities": ["FARGATE"],
|
||
"cpu": "256",
|
||
"memory": "512",
|
||
"executionRoleArn": "arn:aws:iam::account:role/ecsTaskExecutionRole",
|
||
"containerDefinitions": [
|
||
{
|
||
"name": "tyapi-server",
|
||
"image": "<account>.dkr.ecr.us-west-2.amazonaws.com/tyapi-server:latest",
|
||
"portMappings": [
|
||
{
|
||
"containerPort": 8080,
|
||
"protocol": "tcp"
|
||
}
|
||
],
|
||
"environment": [
|
||
{
|
||
"name": "APP_ENV",
|
||
"value": "production"
|
||
}
|
||
],
|
||
"secrets": [
|
||
{
|
||
"name": "DB_PASSWORD",
|
||
"valueFrom": "arn:aws:secretsmanager:us-west-2:account:secret:db-password"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### 3. 部署服务
|
||
|
||
```bash
|
||
# 更新ECS服务
|
||
aws ecs update-service \
|
||
--cluster tyapi-cluster \
|
||
--service tyapi-service \
|
||
--force-new-deployment
|
||
```
|
||
|
||
### Google Cloud Run
|
||
|
||
```bash
|
||
# 推送到 GCR
|
||
docker tag tyapi-server:latest gcr.io/your-project/tyapi-server:latest
|
||
docker push gcr.io/your-project/tyapi-server:latest
|
||
|
||
# 部署到 Cloud Run
|
||
gcloud run deploy tyapi-server \
|
||
--image gcr.io/your-project/tyapi-server:latest \
|
||
--platform managed \
|
||
--region us-central1 \
|
||
--allow-unauthenticated \
|
||
--set-env-vars APP_ENV=production \
|
||
--set-secrets DB_PASSWORD=db-password:latest
|
||
```
|
||
|
||
### Azure Container Instances
|
||
|
||
```bash
|
||
# 推送到 ACR
|
||
az acr login --name your-registry
|
||
docker tag tyapi-server:latest your-registry.azurecr.io/tyapi-server:latest
|
||
docker push your-registry.azurecr.io/tyapi-server:latest
|
||
|
||
# 部署容器实例
|
||
az container create \
|
||
--resource-group tyapi-rg \
|
||
--name tyapi-server \
|
||
--image your-registry.azurecr.io/tyapi-server:latest \
|
||
--dns-name-label tyapi-server \
|
||
--ports 8080 \
|
||
--environment-variables APP_ENV=production \
|
||
--secure-environment-variables DB_PASSWORD=your-password
|
||
```
|
||
|
||
## 负载均衡配置
|
||
|
||
### Nginx 配置
|
||
|
||
创建 `/etc/nginx/sites-available/tyapi-server`:
|
||
|
||
```nginx
|
||
upstream tyapi_backend {
|
||
server 127.0.0.1:8080;
|
||
server 127.0.0.1:8081;
|
||
server 127.0.0.1:8082;
|
||
}
|
||
|
||
server {
|
||
listen 80;
|
||
server_name api.yourdomain.com;
|
||
|
||
location / {
|
||
proxy_pass http://tyapi_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;
|
||
|
||
# 超时设置
|
||
proxy_connect_timeout 30s;
|
||
proxy_send_timeout 30s;
|
||
proxy_read_timeout 30s;
|
||
}
|
||
|
||
# 健康检查
|
||
location /health {
|
||
proxy_pass http://tyapi_backend/api/v1/health;
|
||
access_log off;
|
||
}
|
||
}
|
||
```
|
||
|
||
### HAProxy 配置
|
||
|
||
```haproxy
|
||
global
|
||
daemon
|
||
|
||
defaults
|
||
mode http
|
||
timeout connect 5000ms
|
||
timeout client 50000ms
|
||
timeout server 50000ms
|
||
|
||
frontend tyapi_frontend
|
||
bind *:80
|
||
default_backend tyapi_backend
|
||
|
||
backend tyapi_backend
|
||
balance roundrobin
|
||
option httpchk GET /api/v1/health
|
||
server app1 127.0.0.1:8080 check
|
||
server app2 127.0.0.1:8081 check
|
||
server app3 127.0.0.1:8082 check
|
||
```
|
||
|
||
## 数据库部署
|
||
|
||
### PostgreSQL 高可用
|
||
|
||
#### 主从配置
|
||
|
||
主库配置 `/etc/postgresql/13/main/postgresql.conf`:
|
||
|
||
```conf
|
||
# 复制设置
|
||
wal_level = replica
|
||
max_wal_senders = 3
|
||
wal_keep_segments = 64
|
||
```
|
||
|
||
从库配置:
|
||
|
||
```bash
|
||
# 创建从库
|
||
pg_basebackup -h master-host -D /var/lib/postgresql/13/main -U replicator -P -W
|
||
|
||
# 配置恢复
|
||
echo "standby_mode = 'on'" >> /var/lib/postgresql/13/main/recovery.conf
|
||
echo "primary_conninfo = 'host=master-host port=5432 user=replicator'" >> /var/lib/postgresql/13/main/recovery.conf
|
||
```
|
||
|
||
#### 连接池配置
|
||
|
||
使用 PgBouncer:
|
||
|
||
```ini
|
||
[databases]
|
||
tyapi_prod = host=127.0.0.1 port=5432 dbname=tyapi_prod
|
||
|
||
[pgbouncer]
|
||
listen_port = 6432
|
||
listen_addr = 127.0.0.1
|
||
auth_type = md5
|
||
auth_file = /etc/pgbouncer/userlist.txt
|
||
pool_mode = transaction
|
||
max_client_conn = 1000
|
||
default_pool_size = 25
|
||
```
|
||
|
||
### Redis 集群
|
||
|
||
```bash
|
||
# 启动 Redis 集群
|
||
redis-server redis-7000.conf
|
||
redis-server redis-7001.conf
|
||
redis-server redis-7002.conf
|
||
|
||
# 创建集群
|
||
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0
|
||
```
|
||
|
||
## 监控部署
|
||
|
||
### Prometheus 配置
|
||
|
||
```yaml
|
||
global:
|
||
scrape_interval: 15s
|
||
|
||
scrape_configs:
|
||
- job_name: "tyapi-server"
|
||
static_configs:
|
||
- targets: ["localhost:8080"]
|
||
metrics_path: /metrics
|
||
scrape_interval: 5s
|
||
|
||
- job_name: "postgres"
|
||
static_configs:
|
||
- targets: ["localhost:9187"]
|
||
|
||
- job_name: "redis"
|
||
static_configs:
|
||
- targets: ["localhost:9121"]
|
||
```
|
||
|
||
### Grafana 仪表板
|
||
|
||
导入预配置的仪表板或创建自定义面板监控:
|
||
|
||
- 应用性能指标
|
||
- 数据库性能
|
||
- 系统资源使用
|
||
- 错误率和响应时间
|
||
|
||
## SSL/TLS 配置
|
||
|
||
### Let's Encrypt 证书
|
||
|
||
```bash
|
||
# 安装 Certbot
|
||
sudo apt-get install certbot python3-certbot-nginx
|
||
|
||
# 获取证书
|
||
sudo certbot --nginx -d api.yourdomain.com
|
||
|
||
# 自动续期
|
||
sudo crontab -e
|
||
0 12 * * * /usr/bin/certbot renew --quiet
|
||
```
|
||
|
||
### 自签名证书(开发环境)
|
||
|
||
```bash
|
||
# 生成私钥
|
||
openssl genrsa -out server.key 2048
|
||
|
||
# 生成证书
|
||
openssl req -new -x509 -key server.key -out server.crt -days 365
|
||
```
|
||
|
||
## 部署检查清单
|
||
|
||
### 部署前检查
|
||
|
||
- [ ] 环境变量配置完整
|
||
- [ ] 数据库连接正常
|
||
- [ ] Redis 连接正常
|
||
- [ ] SSL 证书有效
|
||
- [ ] 防火墙规则配置
|
||
- [ ] 监控告警设置
|
||
|
||
### 部署后验证
|
||
|
||
- [ ] 健康检查通过
|
||
- [ ] API 响应正常
|
||
- [ ] 日志输出正常
|
||
- [ ] 监控指标采集
|
||
- [ ] 负载均衡工作
|
||
- [ ] 备份机制测试
|
||
|
||
## 回滚策略
|
||
|
||
### 蓝绿部署
|
||
|
||
```bash
|
||
# 部署新版本到绿环境
|
||
kubectl apply -f k8s/green/
|
||
|
||
# 切换流量到绿环境
|
||
kubectl patch service tyapi-service -p '{"spec":{"selector":{"version":"green"}}}'
|
||
|
||
# 验证后删除蓝环境
|
||
kubectl delete -f k8s/blue/
|
||
```
|
||
|
||
### 金丝雀发布
|
||
|
||
```bash
|
||
# 部署金丝雀版本(10%流量)
|
||
kubectl apply -f k8s/canary/
|
||
|
||
# 逐步增加流量
|
||
kubectl patch virtualservice tyapi-vs -p '{"spec":{"http":[{"match":[{"headers":{"canary":{"exact":"true"}}}],"route":[{"destination":{"host":"tyapi-canary"}}]},{"route":[{"destination":{"host":"tyapi-stable"},"weight":90},{"destination":{"host":"tyapi-canary"},"weight":10}]}]}}'
|
||
```
|