- 新增deploy.sh部署脚本 - 新增docs/短信验证码测试指南.md - 新增docs/部署指南.md - 新增SMS_VERIFICATION_IMPLEMENTATION_STATUS.md - 新增SMS_VERIFICATION_IMPLEMENTATION_SUMMARY.md - 新增github-actions-secrets.md
577 lines
12 KiB
Markdown
577 lines
12 KiB
Markdown
# 短信验证码功能部署指南
|
||
|
||
## 概述
|
||
|
||
本文档说明如何在生产环境中部署短信验证码功能,包括环境配置、数据库迁移、服务配置等。
|
||
|
||
## 前置条件
|
||
|
||
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: 初始版本
|
||
- 添加短信验证码功能
|
||
- 添加账户管理功能
|