Files
life-echo/api/docs/部署指南.md
2026-03-25 17:40:04 +08:00

577 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 短信验证码功能部署指南
## 概述
本文档说明如何在生产环境中部署短信验证码功能,包括环境配置、数据库迁移、服务配置等。
## 前置条件
1. PostgreSQL 数据库已安装并运行
2. Redis 服务已安装并运行
3. 已注册腾讯云账号并开通短信服务
4. 已获取腾讯云短信服务凭证
## 部署步骤
### 1. 腾讯云短信服务配置
#### 1.1 登录腾讯云控制台
访问https://console.cloud.tencent.com/smsv2
#### 1.2 创建短信应用
1. 进入"应用管理"
2. 点击"创建应用"
3. 填写应用名称Life Echo
4. 记录生成的 SDK AppID
#### 1.3 配置短信签名
1. 进入"国内短信" -> "签名管理"
2. 点击"创建签名"
3. 填写签名内容(如:【人生回响】)
4. 选择签名类型App
5. 上传相关证明材料
6. 等待审核通过
#### 1.4 配置短信模板
创建一个通用的验证码模板(所有场景共用):
**验证码模板:**
```
【人生回响】您的验证码是:{1},有效期{2}分钟,请勿泄露给他人。
```
**模板参数说明:**
- `{1}` - 验证码6位数字
- `{2}` - 有效期分钟数5
**注意:** 所有场景(注册、登录、重置密码、修改手机号)共用同一个模板。
记录模板ID。
#### 1.5 获取API密钥
1. 访问https://console.cloud.tencent.com/cam/capi
2. 点击"新建密钥"
3. 记录 SecretId 和 SecretKey
4. **重要:妥善保管密钥,不要泄露**
### 2. 环境变量配置
#### 2.1 编辑生产环境配置文件
编辑 `api/.env.production`
```bash
# 数据库配置
DATABASE_URL=postgresql://username:password@host:5432/life_echo
# Redis配置
REDIS_URL=redis://localhost:6379/0
# JWT配置
JWT_SECRET_KEY=your_jwt_secret_key_here
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
REFRESH_TOKEN_EXPIRE_DAYS=7
# 腾讯云短信服务配置
TENCENT_SMS_SECRET_ID=your_secret_id_here
TENCENT_SMS_SECRET_KEY=your_secret_key_here
TENCENT_SMS_SDK_APP_ID=your_app_id_here
TENCENT_SMS_SIGN_NAME=人生回响
# 统一使用一个短信模板ID所有场景共用
TENCENT_SMS_TEMPLATE_ID=your_template_id_here
# 其他配置
CORS_ORIGINS=["https://your-domain.com"]
```
#### 2.2 配置说明
| 配置项 | 说明 | 示例 |
|--------|------|------|
| `TENCENT_SMS_SECRET_ID` | 腾讯云API密钥ID | `AKIDxxxxxxxxxxxxx` |
| `TENCENT_SMS_SECRET_KEY` | 腾讯云API密钥Key | `xxxxxxxxxxxxxxxx` |
| `TENCENT_SMS_SDK_APP_ID` | 短信应用ID | `1400xxxxxx` |
| `TENCENT_SMS_SIGN_NAME` | 短信签名(不含【】) | `人生回响` |
| `TENCENT_SMS_TEMPLATE_ID` | 短信模板ID所有场景共用 | `123456` |
### 3. 数据库迁移
#### 3.1 备份数据库
```bash
# 备份现有数据库
pg_dump -U postgres -d life_echo > backup_$(date +%Y%m%d_%H%M%S).sql
```
#### 3.2 执行迁移脚本
```bash
# 方式1使用psql命令
psql -U postgres -d life_echo -f api/migrations/add_sms_verification.sql
# 方式2使用数据库管理工具
# 打开 pgAdmin 或其他工具,执行 add_sms_verification.sql 中的SQL语句
```
#### 3.3 验证迁移结果
```sql
-- 检查表是否创建成功
SELECT * FROM information_schema.tables
WHERE table_name = 'sms_verification_codes';
-- 检查索引是否创建成功
SELECT indexname FROM pg_indexes
WHERE tablename = 'sms_verification_codes';
-- 检查 refresh_tokens 表是否添加了 device_info 字段
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'refresh_tokens' AND column_name = 'device_info';
```
### 4. 依赖安装
#### 4.1 更新Python依赖
```bash
cd api
pip install -r requirements.txt
```
确保 `requirements.txt` 中包含:
```
tencentcloud-sdk-python>=3.0.1000
```
#### 4.2 验证依赖安装
```bash
python -c "from tencentcloud.sms.v20210111 import sms_client; print('腾讯云SDK安装成功')"
```
### 5. 服务部署
#### 5.1 使用Docker部署
编辑 `api/docker-compose.yml`,添加环境变量:
```yaml
version: '3.8'
services:
api:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=${DATABASE_URL}
- REDIS_URL=${REDIS_URL}
- JWT_SECRET_KEY=${JWT_SECRET_KEY}
- TENCENT_SMS_SECRET_ID=${TENCENT_SMS_SECRET_ID}
- TENCENT_SMS_SECRET_KEY=${TENCENT_SMS_SECRET_KEY}
- TENCENT_SMS_SDK_APP_ID=${TENCENT_SMS_SDK_APP_ID}
- TENCENT_SMS_SIGN_NAME=${TENCENT_SMS_SIGN_NAME}
- TENCENT_SMS_TEMPLATE_ID=${TENCENT_SMS_TEMPLATE_ID}
depends_on:
- postgres
- redis
restart: unless-stopped
postgres:
image: postgres:15
environment:
- POSTGRES_DB=life_echo
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:7
restart: unless-stopped
volumes:
postgres_data:
```
启动服务:
```bash
cd api
docker compose up -d
```
#### 5.2 使用Systemd部署
创建服务文件 `/etc/systemd/system/life-echo-api.service`
```ini
[Unit]
Description=Life Echo API Service
After=network.target postgresql.service redis.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/life-echo/api
Environment="PATH=/path/to/venv/bin"
EnvironmentFile=/path/to/life-echo/api/.env.production
ExecStart=/path/to/venv/bin/python main.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
启动服务:
```bash
sudo systemctl daemon-reload
sudo systemctl enable life-echo-api
sudo systemctl start life-echo-api
sudo systemctl status life-echo-api
```
### 6. GitHub Actions配置
如果使用GitHub Actions自动部署需要配置Secrets
1. 进入GitHub仓库 -> Settings -> Secrets and variables -> Actions
2. 添加以下Secrets
| Secret名称 | 说明 |
|-----------|------|
| `TENCENT_SMS_SECRET_ID` | 腾讯云API密钥ID |
| `TENCENT_SMS_SECRET_KEY` | 腾讯云API密钥Key |
| `TENCENT_SMS_SDK_APP_ID` | 短信应用ID |
| `TENCENT_SMS_SIGN_NAME` | 短信签名 |
| `TENCENT_SMS_TEMPLATE_ID` | 短信模板ID所有场景共用 |
参考文档:`github-actions-secrets.md`
### 7. 验证部署
#### 7.1 健康检查
```bash
curl http://localhost:8000/health
```
预期响应:
```json
{
"status": "healthy"
}
```
#### 7.2 测试发送验证码
```bash
curl -X POST http://localhost:8000/api/auth/sms/send \
-H "Content-Type: application/json" \
-d '{
"phone": "13800138000",
"purpose": "register"
}'
```
预期响应:
```json
{
"message": "验证码已发送",
"expires_in": 300
}
```
#### 7.3 检查日志
```bash
# Docker部署
docker compose logs -f api
# Systemd部署
sudo journalctl -u life-echo-api -f
```
### 8. 监控与告警
#### 8.1 配置日志监控
建议使用以下工具:
- ELK Stack (Elasticsearch + Logstash + Kibana)
- Grafana + Loki
- 云服务商的日志服务
#### 8.2 配置性能监控
监控指标:
- API响应时间
- 短信发送成功率
- 验证码验证成功率
- 数据库查询性能
- Redis连接状态
#### 8.3 配置告警
告警规则:
- 短信发送失败率 > 5%
- API响应时间 > 2秒
- 数据库连接失败
- Redis连接失败
- 磁盘空间 < 20%
### 9. 安全加固
#### 9.1 防火墙配置
```bash
# 仅允许必要的端口
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
```
#### 9.2 SSL证书配置
使用Let's Encrypt免费证书
```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d api.your-domain.com
```
#### 9.3 限流配置
在Nginx中配置限流
```nginx
limit_req_zone $binary_remote_addr zone=sms_limit:10m rate=1r/m;
location /api/auth/sms/send {
limit_req zone=sms_limit burst=2 nodelay;
proxy_pass http://localhost:8000;
}
```
### 10. 备份与恢复
#### 10.1 数据库备份
设置自动备份:
```bash
# 创建备份脚本
cat > /usr/local/bin/backup-db.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
pg_dump -U postgres -d life_echo | gzip > $BACKUP_DIR/life_echo_$DATE.sql.gz
# 保留最近7天的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
EOF
chmod +x /usr/local/bin/backup-db.sh
# 添加到crontab每天凌晨2点执行
echo "0 2 * * * /usr/local/bin/backup-db.sh" | crontab -
```
#### 10.2 数据恢复
```bash
# 恢复数据库
gunzip < backup_file.sql.gz | psql -U postgres -d life_echo
```
### 11. 故障排查
#### 11.1 短信发送失败
**检查步骤:**
1. 验证环境变量配置
```bash
echo $TENCENT_SMS_SECRET_ID
echo $TENCENT_SMS_SDK_APP_ID
```
2. 检查腾讯云账户余额
3. 查看后端日志
```bash
grep "SMS" /var/log/life-echo-api.log
```
4. 测试API连接
```python
from tencentcloud.common import credential
from tencentcloud.sms.v20210111 import sms_client
cred = credential.Credential(SECRET_ID, SECRET_KEY)
client = sms_client.SmsClient(cred, "ap-guangzhou")
```
#### 11.2 验证码验证失败
**检查步骤:**
1. 查询数据库中的验证码记录
```sql
SELECT * FROM sms_verification_codes
WHERE phone = '13800138000'
ORDER BY created_at DESC
LIMIT 5;
```
2. 检查验证码是否过期
3. 检查验证码是否已使用
4. 检查用途是否匹配
#### 11.3 数据库连接失败
**检查步骤:**
1. 验证数据库服务状态
```bash
sudo systemctl status postgresql
```
2. 检查数据库连接配置
```bash
psql -U postgres -d life_echo -c "SELECT 1"
```
3. 查看数据库日志
```bash
sudo tail -f /var/log/postgresql/postgresql-15-main.log
```
### 12. 性能优化
#### 12.1 数据库优化
```sql
-- 分析表统计信息
ANALYZE sms_verification_codes;
-- 查看慢查询
SELECT * FROM pg_stat_statements
WHERE query LIKE '%sms_verification_codes%'
ORDER BY total_time DESC;
```
#### 12.2 Redis优化
```bash
# 配置Redis持久化
redis-cli CONFIG SET save "900 1 300 10 60 10000"
# 设置最大内存
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
```
#### 12.3 应用优化
- 使用连接池
- 启用缓存
- 异步发送短信
- 批量清理过期验证码
### 13. 定期维护
#### 13.1 清理过期验证码
创建定时任务:
```sql
-- 创建清理函数
CREATE OR REPLACE FUNCTION cleanup_expired_sms_codes()
RETURNS void AS $$
BEGIN
DELETE FROM sms_verification_codes
WHERE expires_at < NOW() - INTERVAL '1 day';
END;
$$ LANGUAGE plpgsql;
-- 每天凌晨3点执行使用pg_cron扩展
SELECT cron.schedule('cleanup-sms', '0 3 * * *', 'SELECT cleanup_expired_sms_codes()');
```
#### 13.2 监控数据库大小
```sql
SELECT
pg_size_pretty(pg_total_relation_size('sms_verification_codes')) as table_size,
(SELECT count(*) FROM sms_verification_codes) as record_count;
```
## 部署检查清单
- [ ] 腾讯云短信服务已配置
- [ ] 环境变量已正确设置
- [ ] 数据库迁移已执行
- [ ] 依赖包已安装
- [ ] 服务已启动并运行
- [ ] 健康检查通过
- [ ] 发送验证码测试通过
- [ ] 日志正常输出
- [ ] 监控已配置
- [ ] 告警已配置
- [ ] 备份已配置
- [ ] SSL证书已配置
- [ ] 防火墙已配置
- [ ] 限流已配置
## 回滚计划
如果部署出现问题,执行以下步骤回滚:
1. 停止新版本服务
```bash
docker compose down
# 或
sudo systemctl stop life-echo-api
```
2. 恢复数据库
```bash
psql -U postgres -d life_echo < backup_file.sql
```
3. 切换到旧版本代码
```bash
git checkout previous-version
```
4. 重启服务
```bash
docker compose up -d
# 或
sudo systemctl start life-echo-api
```
## 联系支持
如有问题,请联系:
- 技术支持邮箱support@your-domain.com
- 开发团队dev@your-domain.com
## 更新日志
- 2024-01-XX: 初始版本
- 添加短信验证码功能
- 添加账户管理功能