Files
novalon-website/docs/PRODUCTION_DEPLOYMENT_LIGHTWEIGHT.md
T

506 lines
9.6 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. [环境准备](#环境准备)
2. [部署流程](#部署流程)
3. [轻量级监控配置](#轻量级监控配置)
4. [告警配置](#告警配置)
5. [维护和运维](#维护和运维)
## 环境准备
### 系统要求
- Linux/Unix 服务器(推荐 Ubuntu 22.04+
- Node.js 18+
- 至少 1GB RAM
- 至少 5GB 磁盘空间
### 必需的软件
```bash
# 安装 Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# 安装 PM2(进程管理器)
npm install -g pm2
```
## 部署流程
### 1. 配置环境变量
复制并编辑生产环境配置:
```bash
cp .env.production .env.local
```
更新以下关键配置:
- `RESEND_API_KEY`: Resend API 密钥
- `NEXT_PUBLIC_SENTRY_DSN`: Sentry DSN
- `NEXTAUTH_SECRET`: 认证密钥
- `ADMIN_PASSWORD`: 管理员密码
- `NEXT_PUBLIC_GA_MEASUREMENT_ID`: Google Analytics ID(可选)
### 2. 安装依赖
```bash
npm ci --production=false
```
### 3. 运行测试
```bash
cd e2e
TEST_ENV=development npx playwright test --reporter=list
cd ..
```
### 4. 构建生产版本
```bash
npm run build
```
### 5. 启动生产服务器
使用 PM2 启动服务:
```bash
pm2 start npm --name "novalon-website" -- start
```
### 6. 验证部署
访问以下URL验证部署:
- 网站: http://localhost:3000
- 健康检查: http://localhost:3000/api/health
- 管理后台: http://localhost:3000/admin
## 轻量级监控配置
### 监控架构
采用轻量级监控方案,包含以下组件:
1. **Sentry** - 错误监控和性能追踪
2. **UptimeRobot** - 外部可用性监控
3. **Google Analytics** - 用户行为和访问统计
4. **健康检查API** - 内部服务状态
5. **邮件告警** - 关键问题通知
### 1. Sentry 错误监控
#### 配置步骤
Sentry 已经集成在项目中,只需配置环境变量:
```env
NEXT_PUBLIC_SENTRY_DSN=https://xxxxxxxxxxxxx@o4507xxxxx.ingest.sentry.io/xxxxxxxxxxxxx
```
#### 配置告警
1. 登录 Sentry Dashboard
2. 进入 Settings → Alerts
3. 创建新的 Alert Rule
- **Issue**: Critical Errors
- **Environment**: Production
- **Frequency**: Immediately
- **Email**: ops@novalon.cn
#### 功能特性
- JavaScript 错误捕获
- 性能监控
- 用户会话回放
- 错误告警
### 2. UptimeRobot 可用性监控
#### 注册和配置
1. 访问 https://uptimerobot.com/
2. 注册免费账号
3. 创建新的 Monitor
- **Monitor Type**: HTTP(s)
- **URL**: https://www.novalon.cn
- **Monitoring Interval**: 5 minutes
- **Alert Contacts**: ops@novalon.cn
#### 配置告警
在 UptimeRobot 中设置:
- **Down Alert**: 网站不可用时发送邮件
- **Up Alert**: 网站恢复时发送邮件
- **SSL Expiry**: SSL 证书过期提醒
#### 推荐监控端点
```yaml
- 主页: https://www.novalon.cn
- 健康检查: https://www.novalon.cn/api/health
- 管理后台: https://www.novalon.cn/admin
```
### 3. Google Analytics 访问统计
#### 获取跟踪 ID
1. 访问 https://analytics.google.com/
2. 创建新的 GA4 属性
3. 复制测量 ID(格式:G-XXXXXXXXXX
#### 配置环境变量
```env
NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX
```
#### 集成到应用
创建 `src/lib/analytics.ts`
```typescript
export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID;
export const pageview = (url: string) => {
if (typeof window !== 'undefined' && GA_MEASUREMENT_ID) {
window.gtag('config', GA_MEASUREMENT_ID, {
page_path: url,
});
}
};
export const event = (action: string, category: string, label?: string) => {
if (typeof window !== 'undefined' && GA_MEASUREMENT_ID) {
window.gtag('event', action, {
event_category: category,
event_label: label,
});
}
};
```
`src/app/layout.tsx` 中添加:
```typescript
import Script from 'next/script';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<head>
{process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID && (
<Script
src={`https://www.googletagmanager.com/gtag/js?id=${process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID}`}
strategy="afterInteractive"
/>
)}
</head>
<body>{children}</body>
</html>
);
}
```
### 4. 健康检查 API
健康检查端点:`/api/health`
**返回数据:**
```json
{
"status": "healthy",
"timestamp": "2024-01-01T00:00:00Z",
"version": "1.0.0",
"checks": {
"database": "connected",
"uptime": 123456
}
}
```
## 告警配置
### 告警策略
只监控关键问题:
- **服务不可用**(通过 UptimeRobot
- **严重错误**(通过 Sentry
- **数据库连接失败**(通过健康检查)
### 告警阈值
| 指标 | 阈值 | 告警级别 | 通知方式 |
|--------|--------|----------|----------|
| 网站可用性 | < 99.9% | Critical | UptimeRobot 邮件 |
| 响应时间 | > 3秒 | Warning | UptimeRobot 邮件 |
| JavaScript 错误 | > 10次/小时 | Critical | Sentry 邮件 |
| 数据库连接 | 失败 | Critical | 手动检查 |
### 邮件通知
**Sentry 告警:**
- 接收邮箱: ops@novalon.cn
- 告警级别: Critical
- 响应时间: 立即
**UptimeRobot 告警:**
- 接收邮箱: ops@novalon.cn
- 告警类型: Down, Up, SSL Expiry
- 响应时间: 立即
## 维护和运维
### 日常维护
#### 每日检查
- [ ] 查看 Sentry 错误报告
- [ ] 检查 UptimeRobot 状态
- [ ] 查看关键日志
#### 每周检查
- [ ] 分析 Google Analytics 数据
- [ ] 检查性能趋势
- [ ] 审查安全日志
#### 每月检查
- [ ] 更新依赖包
- [ ] 备份数据库
- [ ] 审查监控配置
### 日志管理
```bash
# 查看应用日志
pm2 logs novalon-website
# 查看错误日志
pm2 logs novalon-website --err
# 清理旧日志
pm2 flush
```
### 数据库备份
```bash
# 手动备份
./scripts/backup.sh
# 设置定时备份
crontab -e
# 添加以下行(每天凌晨 2 点备份)
0 2 * * * /path/to/scripts/backup.sh
```
### 故障处理
#### 1. 服务无法启动
```bash
# 检查 PM2 状态
pm2 status
# 查看错误日志
pm2 logs novalon-website --err
# 重启服务
pm2 restart novalon-website
```
#### 2. 网站不可用
1. 检查 UptimeRobot 告警
2. 查看服务器状态
3. 检查应用日志
4. 重启服务
#### 3. 错误激增
1. 查看 Sentry 错误详情
2. 分析错误模式
3. 修复关键问题
4. 部署热修复
### 更新部署
#### 零停机部署
```bash
# 1. 构建新版本
npm run build
# 2. 备份当前版本
cp -r dist dist_backup
# 3. 替换新版本
rm -rf dist
mv dist_new dist
# 4. 重启服务(优雅重启)
pm2 reload novalon-website
```
#### 回滚
```bash
# 回滚到上一个版本
rm -rf dist
mv dist_backup dist
# 重启服务
pm2 restart novalon-website
```
### 安全加固
#### 防火墙配置
```bash
# 只允许必要端口
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw enable
```
#### SSL/TLS 配置
```bash
# 使用 Let's Encrypt 获取免费证书
certbot certonly --webroot -w /var/www/html -d www.novalon.cn
# 配置 Nginx
server {
listen 443 ssl;
server_name www.novalon.cn;
ssl_certificate /etc/letsencrypt/live/www.novalon.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.novalon.cn/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
```
#### 定期更新
```bash
# 更新系统包
sudo apt update && sudo apt upgrade -y
# 更新 Node.js 依赖
npm audit fix
npm update
# 更新 PM2
pm2 update
```
## 性能优化
### 1. 应用优化
- 启用 gzip 压缩
- 优化图片和静态资源
- 使用 CDN 加速
### 2. 数据库优化
- 创建适当的索引
- 定期清理旧数据
- 优化查询语句
### 3. 服务器优化
- 调整 PM2 配置
- 配置 swap
- 优化文件系统
## 应急预案
### 1. 服务完全不可用
1. 检查 UptimeRobot 告警
2. 检查服务器状态
3. 查看应用日志
4. 尝试重启服务
5. 如果无法恢复,切换到备用服务器
### 2. 数据丢失
1. 立即停止写入操作
2. 从最近的备份恢复
3. 验证数据完整性
4. 分析丢失原因,防止再次发生
### 3. 安全事件
1. 立即隔离受影响系统
2. 收集日志和证据
3. 评估影响范围
4. 修复安全漏洞
5. 恢复服务
6. 事后分析
## 联系方式
- **运维告警**: ops@novalon.cn
- **业务咨询**: contact@novalon.cn
## 附录
### A. 常用命令
```bash
# 查看服务状态
pm2 status
# 重启服务
pm2 restart novalon-website
# 查看日志
pm2 logs novalon-website
# 检查磁盘空间
df -h
# 检查内存使用
free -h
# 检查进程
ps aux | grep node
```
### B. 配置文件位置
- 应用配置: `/etc/novalon-website/`
- 日志文件: `~/.pm2/logs/`
- 数据文件: `/var/lib/novalon-website/`
- 备份文件: `/var/backups/novalon-website/`
### C. 监控服务
- **Sentry**: https://sentry.io/
- **UptimeRobot**: https://uptimerobot.com/
- **Google Analytics**: https://analytics.google.com/
## 快速开始
### 一键配置脚本
```bash
# 运行轻量级监控配置脚本
chmod +x scripts/setup-lightweight-monitoring.sh
./scripts/setup-lightweight-monitoring.sh
```
这个脚本会:
- 检查 Sentry 配置
- 配置 Google Analytics(可选)
- 提供 UptimeRobot 配置指导
- 创建健康检查端点
- 配置 Sentry 告警
### 部署脚本
```bash
# 运行生产部署脚本
chmod +x scripts/deploy-production.sh
./scripts/deploy-production.sh
```
这个脚本会:
- 安装依赖
- 运行测试
- 构建生产版本
- 启动服务
- 健康检查