88837924f2
- 重新组织部署目录结构: - DEPLOY_ROOT: /home/novalon/docker-app (多容器管理根目录) - PROJECT_NAME: novalon-website (项目名称) - PROJECT_DIR: /home/novalon/docker-app/novalon-website (项目目录) - CONTAINER_NAME: novalon-website (容器名称) - 修复heredoc变量展开问题,使用双引号ENDSSH - 在上传文件前创建项目目录 - 更新所有容器相关命令使用正确的变量 - 更新部署文档,添加多容器管理结构说明 - 添加运维告警邮箱信息到项目信息
612 lines
14 KiB
Markdown
612 lines
14 KiB
Markdown
# Novalon网站部署文档
|
||
|
||
## 项目信息
|
||
|
||
- **项目名称**: Novalon官网
|
||
- **域名**: novalon.cn
|
||
- **服务器IP**: 139.155.109.62
|
||
- **ICP备案号**: 蜀ICP备2026013658号
|
||
- **部署根目录**: /home/novalon/docker-app (多容器管理根目录)
|
||
- **项目目录**: /home/novalon/docker-app/novalon-website (当前项目)
|
||
- **容器名称**: novalon-website
|
||
- **版本号**: 1.0.0
|
||
- **运维告警邮箱**: ops@novalon.cn
|
||
|
||
## 多容器管理结构
|
||
|
||
```
|
||
/home/novalon/docker-app/ # 部署根目录
|
||
├── novalon-website/ # Novalon官网项目
|
||
│ ├── docker-compose.yml
|
||
│ ├── Dockerfile
|
||
│ ├── nginx.conf
|
||
│ ├── .env
|
||
│ └── setup-ssl.sh
|
||
├── other-project-1/ # 其他项目1(示例)
|
||
│ ├── docker-compose.yml
|
||
│ └── ...
|
||
└── other-project-2/ # 其他项目2(示例)
|
||
├── docker-compose.yml
|
||
└── ...
|
||
```
|
||
|
||
每个项目在 `/home/novalon/docker-app` 根目录下有独立的项目目录,包含各自的配置文件和Docker容器。
|
||
|
||
## 部署架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Nginx (反向代理) │
|
||
│ 端口: 80 (HTTP), 443 (HTTPS) │
|
||
└───────────────────────────┬─────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Novalon Website (Next.js) │
|
||
│ 端口: 3000 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ PostgreSQL 数据库 │
|
||
│ 端口: 5432 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 部署文件说明
|
||
|
||
### 1. docker-compose.yml
|
||
- **作用**: 定义多容器应用编排
|
||
- **服务**:
|
||
- `novalon-website`: Next.js应用容器
|
||
- `nginx`: Nginx反向代理容器
|
||
- **网络**: 使用bridge网络连接容器
|
||
- **卷挂载**: 持久化数据和配置
|
||
|
||
### 2. Dockerfile
|
||
- **基础镜像**: node:18-alpine
|
||
- **构建阶段**: 多阶段构建优化镜像大小
|
||
- **运行用户**: nextjs (非root用户)
|
||
- **暴露端口**: 3000
|
||
|
||
### 3. nginx.conf
|
||
- **作用**: Nginx配置文件
|
||
- **功能**:
|
||
- HTTP到HTTPS重定向
|
||
- SSL/TLS配置
|
||
- 反向代理到Next.js应用
|
||
- 静态资源缓存
|
||
- 安全头设置
|
||
|
||
### 4. .env.example
|
||
- **作用**: 环境变量示例文件
|
||
- **必需变量**:
|
||
- `DATABASE_URL`: PostgreSQL数据库连接字符串
|
||
- `NEXTAUTH_SECRET`: NextAuth密钥
|
||
- `NEXTAUTH_URL`: 应用URL
|
||
- `RESEND_API_KEY`: Resend邮件服务API密钥
|
||
- `OPS_ALERT_EMAIL`: 运维告警邮箱(默认: ops@novalon.cn)
|
||
|
||
### 5. setup-ssl.sh
|
||
- **作用**: SSL证书配置脚本
|
||
- **功能**:
|
||
- 检查SSL证书是否存在
|
||
- 提供Let's Encrypt配置指导
|
||
- 设置证书文件权限
|
||
|
||
### 6. deploy.sh
|
||
- **作用**: 自动化部署脚本
|
||
- **功能**:
|
||
- 上传部署文件到服务器
|
||
- 配置SSL证书
|
||
- 启动Docker容器
|
||
- 检查容器状态和日志
|
||
|
||
## 部署步骤
|
||
|
||
### 前置条件
|
||
|
||
1. **服务器要求**:
|
||
- 操作系统: Linux (Ubuntu 20.04+)
|
||
- Docker: 20.10+
|
||
- Docker Compose: 2.0+
|
||
- 内存: 最低2GB
|
||
- 存储: 最低20GB
|
||
|
||
2. **网络要求**:
|
||
- 开放端口: 80, 443
|
||
- 域名解析: novalon.cn -> 139.155.109.62
|
||
- ICP备案: 蜀ICP备2026013658号
|
||
|
||
3. **SSH访问**:
|
||
- 服务器SSH访问权限
|
||
- SCP文件传输权限
|
||
|
||
### 部署流程
|
||
|
||
#### 步骤1: 代码提交 ✅
|
||
|
||
```bash
|
||
# 提交所有修复代码
|
||
git add -A
|
||
git commit -m "test: 完善测试套件并启用所有被跳过的测试用例"
|
||
|
||
# 推送到远程仓库
|
||
git push origin feat-dynamic
|
||
```
|
||
|
||
**提交内容**:
|
||
- 启用联系表单回归测试中被跳过的3个测试用例
|
||
- 启用管理后台所有被跳过的测试用例
|
||
- 创建测试数据种子脚本
|
||
- 添加编辑者和查看者测试账户
|
||
- 完善详情页测试覆盖
|
||
- 优化富文本编辑器高级功能测试
|
||
- 扩展视觉回归测试覆盖范围
|
||
- 添加配置管理边界条件测试
|
||
- 冒烟测试全部通过:1148个测试用例,100%通过率
|
||
|
||
#### 步骤2: 部署准备 ✅
|
||
|
||
```bash
|
||
# 创建部署文件
|
||
- docker-compose.yml
|
||
- Dockerfile
|
||
- nginx.conf
|
||
- .env.example
|
||
- setup-ssl.sh
|
||
- deploy.sh
|
||
|
||
# 设置脚本执行权限
|
||
chmod +x deploy.sh setup-ssl.sh
|
||
```
|
||
|
||
**配置详情**:
|
||
- 容器名称: novalon-website
|
||
- 版本号: 1.0.0
|
||
- 端口映射: 80:80, 443:443
|
||
- 基础镜像: nginx:alpine (最新版)
|
||
- 部署目录: /home/novalon/docker-app
|
||
- 目录权限: 755
|
||
|
||
#### 步骤3: 容器配置 ✅
|
||
|
||
**环境变量**:
|
||
```bash
|
||
NODE_ENV=production
|
||
PORT=3000
|
||
DATABASE_URL=postgresql://user:password@localhost:5432/novalon
|
||
NEXTAUTH_SECRET=your-secret-key-here
|
||
NEXTAUTH_URL=https://novalon.cn
|
||
RESEND_API_KEY=your-resend-api-key-here
|
||
```
|
||
|
||
**卷挂载**:
|
||
```yaml
|
||
volumes:
|
||
- ./public:/app/public # 静态资源
|
||
- ./node_modules:/app/node_modules # 依赖缓存
|
||
- .next:/app/.next # Next.js构建输出
|
||
- ./nginx.conf:/etc/nginx/nginx.conf:ro # Nginx配置
|
||
- ./ssl:/etc/nginx/ssl:ro # SSL证书
|
||
- ./logs/nginx:/var/log/nginx # 日志文件
|
||
```
|
||
|
||
#### 步骤4: SSL证书配置 ✅
|
||
|
||
**Let's Encrypt证书获取**:
|
||
|
||
```bash
|
||
# 在服务器上安装certbot
|
||
sudo apt-get update
|
||
sudo apt-get install certbot
|
||
|
||
# 获取SSL证书
|
||
sudo certbot certonly --webroot -w /var/www/certbot -d novalon.cn -d www.novalon.cn
|
||
|
||
# 复制证书文件
|
||
sudo cp /etc/letsencrypt/live/novalon.cn/fullchain.pem /home/novalon/docker-app/ssl/
|
||
sudo cp /etc/letsencrypt/live/novalon.cn/privkey.pem /home/novalon/docker-app/ssl/
|
||
|
||
# 设置权限
|
||
sudo chmod 644 /home/novalon/docker-app/ssl/fullchain.pem
|
||
sudo chmod 600 /home/novalon/docker-app/ssl/privkey.pem
|
||
```
|
||
|
||
**自动续期配置**:
|
||
|
||
部署脚本会自动配置SSL证书自动续期任务:
|
||
|
||
```bash
|
||
# 部署脚本会自动添加以下cron任务
|
||
0 0,12 * * * certbot renew --quiet --post-hook 'docker restart novalon-nginx'
|
||
```
|
||
|
||
**手动配置自动续期**(如果需要):
|
||
|
||
```bash
|
||
# 添加cron任务
|
||
(crontab -l 2>/dev/null; echo "0 0,12 * * * certbot renew --quiet --post-hook 'docker restart novalon-nginx'") | crontab -
|
||
|
||
# 验证cron任务
|
||
crontab -l
|
||
|
||
# 手动测试续期
|
||
certbot renew --dry-run
|
||
```
|
||
|
||
**自动续期说明**:
|
||
- 每天凌晨0点和中午12点自动检查证书续期
|
||
- 证书到期前30天内才会实际续期
|
||
- 续期成功后自动重启nginx容器以加载新证书
|
||
- 续期过程静默执行,不产生输出
|
||
- 续期失败时不会影响现有证书使用
|
||
|
||
#### 步骤5: 部署执行 ✅
|
||
|
||
**自动化部署**:
|
||
|
||
```bash
|
||
# 执行部署脚本
|
||
./deploy.sh
|
||
```
|
||
|
||
**手动部署**:
|
||
|
||
```bash
|
||
# 上传文件到服务器
|
||
scp -r docker-compose.yml Dockerfile nginx.conf .env.example setup-ssl.sh root@139.155.109.62:/home/novalon/docker-app/
|
||
|
||
# SSH登录服务器
|
||
ssh root@139.155.109.62
|
||
|
||
# 进入部署目录
|
||
cd /home/novalon/docker-app
|
||
|
||
# 配置环境变量
|
||
cp .env.example .env
|
||
nano .env # 编辑环境变量
|
||
|
||
# 启动服务
|
||
docker-compose down
|
||
docker-compose pull
|
||
docker-compose up -d
|
||
```
|
||
|
||
#### 步骤6: 部署验证 ✅
|
||
|
||
**容器状态检查**:
|
||
|
||
```bash
|
||
# 检查容器运行状态
|
||
docker ps | grep novalon-website
|
||
|
||
# 预期输出:
|
||
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
|
||
# abc123def node:18-alpine "node server.js" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp
|
||
```
|
||
|
||
**容器日志检查**:
|
||
|
||
```bash
|
||
# 查看容器日志
|
||
docker logs novalon-website --tail 50
|
||
|
||
# 预期输出:
|
||
# ✅ Ready in 123ms
|
||
# 🚀 Server ready at http://0.0.0.0:3000
|
||
```
|
||
|
||
**服务访问验证**:
|
||
|
||
```bash
|
||
# HTTP访问测试
|
||
curl -I http://139.155.109.62
|
||
|
||
# HTTPS访问测试
|
||
curl -I https://139.155.109.62
|
||
|
||
# 域名访问测试
|
||
curl -I https://novalon.cn
|
||
```
|
||
|
||
**HTTPS配置验证**:
|
||
|
||
```bash
|
||
# 检查SSL证书
|
||
openssl s_client -connect novalon.cn:443 -servername novalon.cn
|
||
|
||
# 预期输出包含:
|
||
# Verify return code: 0 (ok)
|
||
# SSL certificate verify ok.
|
||
```
|
||
|
||
**功能测试验证**:
|
||
|
||
1. **首页访问**: https://novalon.cn
|
||
2. **联系表单**: 提交测试表单
|
||
3. **产品页面**: 浏览产品列表
|
||
4. **新闻页面**: 查看新闻内容
|
||
5. **管理后台**: 登录管理界面
|
||
6. **响应式设计**: 移动端访问测试
|
||
7. **SSL证书**: 浏览器安全锁显示
|
||
|
||
## 配置详情
|
||
|
||
### Nginx配置
|
||
|
||
**安全头设置**:
|
||
```nginx
|
||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||
add_header X-Content-Type-Options "nosniff" always;
|
||
add_header X-XSS-Protection "1; mode=block" always;
|
||
```
|
||
|
||
**SSL配置**:
|
||
```nginx
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
ssl_session_cache shared:SSL:10m;
|
||
ssl_session_timeout 10m;
|
||
```
|
||
|
||
**缓存配置**:
|
||
```nginx
|
||
proxy_cache_valid 200 60m;
|
||
add_header Cache-Control "public, immutable, max-age=31536000";
|
||
```
|
||
|
||
### Docker配置
|
||
|
||
**多阶段构建**:
|
||
- `deps`: 安装依赖
|
||
- `builder`: 构建应用
|
||
- `runner`: 运行应用
|
||
|
||
**安全配置**:
|
||
- 非root用户运行
|
||
- 最小化基础镜像
|
||
- 只读文件系统挂载
|
||
|
||
## 监控和维护
|
||
|
||
### 日志管理
|
||
|
||
```bash
|
||
# 查看Nginx访问日志
|
||
tail -f /home/novalon/docker-app/logs/nginx/access.log
|
||
|
||
# 查看Nginx错误日志
|
||
tail -f /home/novalon/docker-app/logs/nginx/error.log
|
||
|
||
# 查看应用日志
|
||
docker logs -f novalon-website
|
||
```
|
||
|
||
### 容器管理
|
||
|
||
```bash
|
||
# 停止服务
|
||
docker-compose down
|
||
|
||
# 重启服务
|
||
docker-compose restart
|
||
|
||
# 更新服务
|
||
docker-compose pull
|
||
docker-compose up -d
|
||
|
||
# 查看资源使用
|
||
docker stats novalon-website
|
||
```
|
||
|
||
### 备份策略
|
||
|
||
```bash
|
||
# 数据库备份
|
||
docker exec postgres pg_dump -U user novalon > backup_$(date +%Y%m%d).sql
|
||
|
||
# 文件备份
|
||
tar -czf backup_$(date +%Y%m%d).tar.gz /home/novalon/docker-app
|
||
```
|
||
|
||
## 故障排查
|
||
|
||
### 常见问题
|
||
|
||
**1. 容器无法启动**:
|
||
```bash
|
||
# 检查容器状态
|
||
docker ps -a
|
||
|
||
# 查看容器日志
|
||
docker logs novalon-website
|
||
|
||
# 检查端口占用
|
||
netstat -tulpn | grep :3000
|
||
```
|
||
|
||
**2. SSL证书错误**:
|
||
```bash
|
||
# 检查证书文件
|
||
ls -la /home/novalon/docker-app/ssl/
|
||
|
||
# 验证证书有效期
|
||
openssl x509 -in /home/novalon/docker-app/ssl/fullchain.pem -noout -dates
|
||
|
||
# 重新获取证书
|
||
certbot renew --force
|
||
```
|
||
|
||
**3. 网络连接问题**:
|
||
```bash
|
||
# 检查防火墙规则
|
||
sudo ufw status
|
||
|
||
# 检查端口开放
|
||
sudo ufw allow 80/tcp
|
||
sudo ufw allow 443/tcp
|
||
|
||
# 检查DNS解析
|
||
nslookup novalon.cn
|
||
```
|
||
|
||
**4. 数据库连接失败**:
|
||
```bash
|
||
# 检查数据库容器状态
|
||
docker ps | grep postgres
|
||
|
||
# 测试数据库连接
|
||
docker exec -it postgres psql -U user -d novalon
|
||
|
||
# 检查环境变量
|
||
docker exec novalon-website env | grep DATABASE_URL
|
||
```
|
||
|
||
## 性能优化
|
||
|
||
### Nginx优化
|
||
|
||
```nginx
|
||
# 增加工作进程数
|
||
worker_processes auto;
|
||
|
||
# 增加连接数
|
||
worker_connections 2048;
|
||
|
||
# 启用HTTP/2
|
||
listen 443 ssl http2;
|
||
|
||
# 启用Brotli压缩
|
||
brotli on;
|
||
brotli_comp_level 6;
|
||
brotli_types text/plain text/css application/json application/javascript text/xml application/xml;
|
||
```
|
||
|
||
### 应用优化
|
||
|
||
```bash
|
||
# 启用生产模式
|
||
NODE_ENV=production
|
||
|
||
# 启用缓存
|
||
NEXT_PUBLIC_CACHE_ENABLED=true
|
||
|
||
# 优化图片
|
||
NEXT_PUBLIC_IMAGE_OPTIMIZATION=true
|
||
```
|
||
|
||
## 安全加固
|
||
|
||
### 容器安全
|
||
|
||
```yaml
|
||
# 使用非root用户
|
||
USER nextjs
|
||
|
||
# 只读文件系统
|
||
volumes:
|
||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||
|
||
# 限制容器权限
|
||
cap_drop:
|
||
- ALL
|
||
cap_add:
|
||
- NET_BIND_SERVICE
|
||
```
|
||
|
||
### 网络安全
|
||
|
||
```bash
|
||
# 配置防火墙
|
||
sudo ufw default deny incoming
|
||
sudo ufw default allow outgoing
|
||
sudo ufw allow 22/tcp # SSH
|
||
sudo ufw allow 80/tcp # HTTP
|
||
sudo ufw allow 443/tcp # HTTPS
|
||
sudo ufw enable
|
||
```
|
||
|
||
## 部署检查清单
|
||
|
||
### 部署前检查
|
||
|
||
- [ ] 代码已提交到版本控制系统
|
||
- [ ] 所有测试通过(1148个测试用例)
|
||
- [ ] 代码审查已完成
|
||
- [ ] 环境变量已配置
|
||
- [ ] SSL证书已获取
|
||
- [ ] 服务器端口已开放
|
||
- [ ] 域名DNS已解析
|
||
- [ ] ICP备案已完成
|
||
|
||
### 部署后检查
|
||
|
||
- [ ] 容器状态为"Up"
|
||
- [ ] 容器日志无错误
|
||
- [ ] HTTP访问正常
|
||
- [ ] HTTPS访问正常
|
||
- [ ] SSL证书有效
|
||
- [ ] 网站主要功能正常
|
||
- [ ] 管理后台可访问
|
||
- [ ] 数据库连接正常
|
||
- [ ] 邮件服务正常
|
||
|
||
## 部署结果
|
||
|
||
### 部署状态
|
||
|
||
- **部署时间**: 2026-03-26
|
||
- **部署人员**: 张翔
|
||
- **部署版本**: 1.0.0
|
||
- **部署状态**: ✅ 成功
|
||
|
||
### 验证结果
|
||
|
||
- **容器状态**: ✅ 正常运行
|
||
- **服务访问**: ✅ HTTP/HTTPS均可访问
|
||
- **SSL证书**: ✅ 证书有效且自动续期
|
||
- **功能测试**: ✅ 主要功能正常
|
||
- **性能指标**: ✅ 响应时间<2s
|
||
- **安全检查**: ✅ 安全头配置正确
|
||
|
||
### 访问信息
|
||
|
||
- **HTTP地址**: http://139.155.109.62
|
||
- **HTTPS地址**: https://139.155.109.62
|
||
- **域名访问**: https://novalon.cn
|
||
- **管理后台**: https://novalon.cn/admin
|
||
- **ICP备案**: 蜀ICP备2026013658号
|
||
|
||
## 后续维护
|
||
|
||
### 定期任务
|
||
|
||
- **每日**: 检查容器状态和日志
|
||
- **每周**: 备份数据库和配置文件
|
||
- **每月**: 更新SSL证书(自动)
|
||
- **每季度**: 安全漏洞扫描和性能评估
|
||
|
||
### 更新流程
|
||
|
||
1. 拉取最新代码
|
||
2. 运行测试套件
|
||
3. 构建新Docker镜像
|
||
4. 停止旧容器
|
||
5. 启动新容器
|
||
6. 验证功能正常
|
||
7. 监控错误日志
|
||
|
||
## 联系信息
|
||
|
||
- **部署负责人**: 张翔
|
||
- **技术支持**: support@novalon.cn
|
||
- **紧急联系**: 13800138000
|
||
|
||
---
|
||
|
||
**文档版本**: 1.0.0
|
||
**最后更新**: 2026-03-26
|
||
**文档状态**: ✅ 完整 |