Files
novalon-website/DEPLOYMENT.md
T
张翔 88837924f2 refactor: 调整部署结构以支持多容器管理
- 重新组织部署目录结构:
  - DEPLOY_ROOT: /home/novalon/docker-app (多容器管理根目录)
  - PROJECT_NAME: novalon-website (项目名称)
  - PROJECT_DIR: /home/novalon/docker-app/novalon-website (项目目录)
  - CONTAINER_NAME: novalon-website (容器名称)
- 修复heredoc变量展开问题,使用双引号ENDSSH
- 在上传文件前创建项目目录
- 更新所有容器相关命令使用正确的变量
- 更新部署文档,添加多容器管理结构说明
- 添加运维告警邮箱信息到项目信息
2026-03-26 19:38:17 +08:00

14 KiB
Raw Blame History

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: 代码提交

# 提交所有修复代码
git add -A
git commit -m "test: 完善测试套件并启用所有被跳过的测试用例"

# 推送到远程仓库
git push origin feat-dynamic

提交内容:

  • 启用联系表单回归测试中被跳过的3个测试用例
  • 启用管理后台所有被跳过的测试用例
  • 创建测试数据种子脚本
  • 添加编辑者和查看者测试账户
  • 完善详情页测试覆盖
  • 优化富文本编辑器高级功能测试
  • 扩展视觉回归测试覆盖范围
  • 添加配置管理边界条件测试
  • 冒烟测试全部通过:1148个测试用例,100%通过率

步骤2: 部署准备

# 创建部署文件
- 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: 容器配置

环境变量:

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

卷挂载:

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证书获取:

# 在服务器上安装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证书自动续期任务:

# 部署脚本会自动添加以下cron任务
0 0,12 * * * certbot renew --quiet --post-hook 'docker restart novalon-nginx'

手动配置自动续期(如果需要):

# 添加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: 部署执行

自动化部署:

# 执行部署脚本
./deploy.sh

手动部署:

# 上传文件到服务器
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: 部署验证

容器状态检查:

# 检查容器运行状态
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

容器日志检查:

# 查看容器日志
docker logs novalon-website --tail 50

# 预期输出:
# ✅ Ready in 123ms
# 🚀 Server ready at http://0.0.0.0:3000

服务访问验证:

# HTTP访问测试
curl -I http://139.155.109.62

# HTTPS访问测试
curl -I https://139.155.109.62

# 域名访问测试
curl -I https://novalon.cn

HTTPS配置验证:

# 检查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配置

安全头设置:

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配置:

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;

缓存配置:

proxy_cache_valid 200 60m;
add_header Cache-Control "public, immutable, max-age=31536000";

Docker配置

多阶段构建:

  • deps: 安装依赖
  • builder: 构建应用
  • runner: 运行应用

安全配置:

  • 非root用户运行
  • 最小化基础镜像
  • 只读文件系统挂载

监控和维护

日志管理

# 查看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

容器管理

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

# 更新服务
docker-compose pull
docker-compose up -d

# 查看资源使用
docker stats novalon-website

备份策略

# 数据库备份
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. 容器无法启动:

# 检查容器状态
docker ps -a

# 查看容器日志
docker logs novalon-website

# 检查端口占用
netstat -tulpn | grep :3000

2. SSL证书错误:

# 检查证书文件
ls -la /home/novalon/docker-app/ssl/

# 验证证书有效期
openssl x509 -in /home/novalon/docker-app/ssl/fullchain.pem -noout -dates

# 重新获取证书
certbot renew --force

3. 网络连接问题:

# 检查防火墙规则
sudo ufw status

# 检查端口开放
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 检查DNS解析
nslookup novalon.cn

4. 数据库连接失败:

# 检查数据库容器状态
docker ps | grep postgres

# 测试数据库连接
docker exec -it postgres psql -U user -d novalon

# 检查环境变量
docker exec novalon-website env | grep DATABASE_URL

性能优化

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;

应用优化

# 启用生产模式
NODE_ENV=production

# 启用缓存
NEXT_PUBLIC_CACHE_ENABLED=true

# 优化图片
NEXT_PUBLIC_IMAGE_OPTIMIZATION=true

安全加固

容器安全

# 使用非root用户
USER nextjs

# 只读文件系统
volumes:
  - ./nginx.conf:/etc/nginx/nginx.conf:ro

# 限制容器权限
cap_drop:
  - ALL
cap_add:
  - NET_BIND_SERVICE

网络安全

# 配置防火墙
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
  • 安全检查: 安全头配置正确

访问信息

后续维护

定期任务

  • 每日: 检查容器状态和日志
  • 每周: 备份数据库和配置文件
  • 每月: 更新SSL证书(自动)
  • 每季度: 安全漏洞扫描和性能评估

更新流程

  1. 拉取最新代码
  2. 运行测试套件
  3. 构建新Docker镜像
  4. 停止旧容器
  5. 启动新容器
  6. 验证功能正常
  7. 监控错误日志

联系信息


文档版本: 1.0.0 最后更新: 2026-03-26 文档状态: 完整