✅ 为什么需要检查清单
飞行员起飞前要检查清单,上线也一样。人会忘事,清单不会。每次上线都过一遍,养成习惯。
📋 使用方式
打印这个页面或收藏起来。每次部署新项目上线时,按顺序逐项确认。
□ SSH 已配置密钥登录
□ 已禁用 root 远程密码登录
□ 已创建专用 deploy 用户
□ 防火墙已开启,仅开放必要端口(80/443/SSH)
□ 阿里云安全组规则已配置
□ 敏感信息(密码、API Key)使用环境变量,不在代码中
□ .env 文件已在 .gitignore 中
□ HTTPS 已配置(Let's Encrypt)
□ Certbot 自动续期已验证
□ 系统已更新(apt update && apt upgrade)
□ Docker 已安装并正常运行
□ Docker 镜像加速已配置(国内服务器)
□ Nginx 已安装并设为开机自启
□ 应用目录权限正确(deploy 用户可读写)
□ 磁盘空间充足(df -h → Use% < 80%)
□ 内存充足(free -h → available > 500MB)
□ 时区已设置正确(timedatectl)
□ 应用容器正常运行(docker ps)
□ 应用日志无错误(docker logs app)
□ 数据库连接正常
□ Redis 连接正常(如果用到)
□ 数据卷已配置(数据库数据不会丢失)
□ 健康检查接口可访问(curl localhost:PORT/health)
🩺 Health Check 接口设计
✅ 存活探针 vs 就绪探针
存活探针(Liveness):进程活着吗?失败则重启容器。
GET /health/live → 只要进程正常就返回 200。
就绪探针(Readiness):能处理请求吗?失败则从负载均衡摘除。
GET /health/ready → 检查 DB、Redis 等依赖是否可用。
📋 健康检查规范
• 路径:/health 或 /health/ready
• 200 = 健康,503 = 不健康
• 不需要认证(让监控系统可以直接访问)
• 响应要快(<500ms),不做复杂计算
• 返回各依赖状态便于排查
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import asyncpg, redis.asyncio as aioredis
app = FastAPI()
@app.get("/health")
async def health_check():
"""存活探针:进程在就返回 200"""
return {"status": "ok"}
@app.get("/health/ready")
async def readiness_check():
"""就绪探针:检查所有依赖"""
checks = {}
ok = True
# 检查数据库
try:
conn = await asyncpg.connect(DATABASE_URL, timeout=2)
await conn.execute("SELECT 1")
await conn.close()
checks["database"] = "ok"
except Exception as e:
checks["database"] = f"error: {e}"
ok = False
# 检查 Redis
try:
r = aioredis.from_url(REDIS_URL, socket_timeout=2)
await r.ping()
await r.aclose()
checks["redis"] = "ok"
except Exception as e:
checks["redis"] = f"error: {e}"
ok = False
return JSONResponse(
status_code=200 if ok else 503,
content={"status": "ok" if ok else "degraded", "checks": checks},
)
# 响应示例(健康):
# {"status": "ok", "checks": {"database": "ok", "redis": "ok"}}
# 响应示例(不健康):
# {"status": "degraded", "checks": {"database": "ok", "redis": "error: timeout"}}
# HTTP 503 → 负载均衡自动摘除该节点
# docker-compose.yml 配置健康检查
services:
app:
image: myapp:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s # 每 30 秒检查一次
timeout: 5s # 超时 5 秒认为失败
retries: 3 # 连续失败 3 次才标记不健康
start_period: 10s # 启动后 10 秒内不检查(等应用初始化)
# Nginx 上线检查清单追加:
□ Health Check 接口可访问:curl localhost:8000/health → 200
□ 就绪探针可访问:curl localhost:8000/health/ready → {"status":"ok"}
□ docker-compose.yml 已配置 healthcheck
□ Nginx upstream 只转发到健康节点(已配置 fail_timeout)
□ Nginx 配置语法正确(nginx -t)
□ 通过 IP 可以访问(curl http://SERVER_IP)
□ 通过域名可以访问(curl http://your-domain.com)
□ HTTPS 可以访问(curl https://your-domain.com)
□ HTTP 自动跳转 HTTPS
□ API 接口可正常调用
□ SPA 路由刷新不 404(try_files 已配置)
□ gzip 压缩已开启(curl -H "Accept-Encoding: gzip" -I)
□ GitHub Actions CI 流水线正常(测试、lint、构建)
□ CD 自动部署已配置且测试通过
□ GitHub Secrets 已正确配置
□ 部署后健康检查通过
□ 回滚方案已准备(保留上一版本镜像或 git revert)
□ 知道如何查看应用日志(docker logs -f)
□ 知道如何查看 Nginx 日志
□ 知道如何检查 CPU/内存/磁盘
□ 有告警机制(阿里云云监控 / UptimeRobot 等)
□ 日志不会撑满磁盘(已配置日志轮转或定期清理)
💡
上线后第一天:前几个小时多看日志和监控。第二天检查一下磁盘和内存使用趋势。一周后确认日志不会无限增长。
📋 紧急故障处理速查
| 问题 | 排查命令 |
| 网站打不开 | ping IP → curl IP:80 → nginx -t |
| 502 错误 | docker ps → docker logs app |
| 服务器很慢 | top → free -h → df -h |
| 磁盘满了 | du -sh /* → docker system prune |
| SSH 连不上 | 阿里云控制台 VNC 登录 → 检查 sshd |