Files
website/PRODUCTION_DEPLOY.md
2025-11-21 23:18:13 +08:00

5.9 KiB
Raw Permalink Blame History

OmniVerse 官网生产环境部署指南

部署架构

Internet (80/443)
    ↓
Nginx Reverse Proxy (Docker)
    ↓
    ├─→ Frontend App (Port 3000, Docker)
    └─→ News Crawler API (Port 3001, Docker)

服务组件

  1. Nginx - 反向代理和SSL终止 (80/443端口)
  2. Web Frontend - React应用 (内部3000端口)
  3. News Crawler - 新闻爬虫服务 (内部3001端口)
  4. Certbot - SSL证书自动续期

部署前准备

1. 检查域名DNS解析

确保域名已正确解析到服务器:

nslookup www.omniverseai.net
nslookup omniverseai.net

2. 检查必要端口

确保以下端口可用:

# 检查端口占用
netstat -tlnp | grep -E ':(80|443) '

# 如有其他服务占用,需要先停止

3. 安装Docker和Docker Compose

# 检查Docker版本
docker --version
docker-compose --version

# 如未安装,请先安装Docker

4. 配置环境变量

编辑 .env.production 文件,修改必要的配置:

nano .env.production

重要配置项:

  • API_KEY: 修改为强密码
  • CORS_ORIGIN: 确认域名正确

部署步骤

第一步:初始部署(HTTP)

首次部署使用HTTP模式,用于SSL证书申请:

# 运行部署脚本
./deploy-prod.sh

部署脚本会:

  1. 停止旧容器
  2. 构建Docker镜像
  3. 启动所有服务
  4. 显示服务状态

第二步:验证HTTP访问

访问 http://www.omniverseai.net 确认网站可以正常访问。

# 检查服务状态
docker-compose -f docker-compose.prod.yml ps

# 查看日志
docker-compose -f docker-compose.prod.yml logs -f web
docker-compose -f docker-compose.prod.yml logs -f news-crawler
docker-compose -f docker-compose.prod.yml logs -f nginx

第三步:申请SSL证书

确认HTTP访问正常后,运行SSL初始化脚本:

# 申请证书(首次)
./init-ssl.sh

第四步:启用HTTPS

证书申请成功后,需要更新Nginx配置:

  1. 编辑 nginx/default.conf:
nano nginx/default.conf
  1. 进行以下修改:

    • 在HTTP服务器块中,注释掉临时的 proxy_pass 配置
    • 取消注释 HTTP到HTTPS重定向配置
    • 取消注释整个HTTPS服务器配置块
  2. 重启Nginx:

docker-compose -f docker-compose.prod.yml restart nginx
  1. 验证HTTPS访问: 访问 https://www.omniverseai.net

管理命令

查看服务状态

docker-compose -f docker-compose.prod.yml ps

查看日志

# 查看所有服务日志
docker-compose -f docker-compose.prod.yml logs -f

# 查看特定服务日志
docker-compose -f docker-compose.prod.yml logs -f web
docker-compose -f docker-compose.prod.yml logs -f nginx
docker-compose -f docker-compose.prod.yml logs -f news-crawler

重启服务

# 重启所有服务
docker-compose -f docker-compose.prod.yml restart

# 重启特定服务
docker-compose -f docker-compose.prod.yml restart web
docker-compose -f docker-compose.prod.yml restart nginx

停止服务

docker-compose -f docker-compose.prod.yml down

更新部署

# 拉取最新代码
git pull

# 重新部署
./deploy-prod.sh

SSL证书续期

Certbot容器会自动续期证书(每12小时检查一次)。也可以手动续期:

docker-compose -f docker-compose.prod.yml run --rm certbot renew
docker-compose -f docker-compose.prod.yml restart nginx

监控和维护

健康检查

# Web服务健康检查
curl http://localhost:3000

# News爬虫服务健康检查
curl http://localhost:3001/health

# Nginx状态
curl -I http://www.omniverseai.net

数据备份

新闻数据库和日志存储在Docker volumes中:

# 查看volumes
docker volume ls | grep omniverse

# 备份新闻数据库
docker run --rm -v website_news_data:/data -v $(pwd):/backup alpine tar czf /backup/news_data_backup.tar.gz -C /data .

# 备份日志
docker run --rm -v website_news_logs:/logs -v $(pwd):/backup alpine tar czf /backup/news_logs_backup.tar.gz -C /logs .

清理旧数据

新闻爬虫服务会自动清理7天前的旧新闻(可在 .env.production 中配置)。

故障排查

网站无法访问

  1. 检查服务是否运行:
docker-compose -f docker-compose.prod.yml ps
  1. 检查Nginx日志:
docker-compose -f docker-compose.prod.yml logs nginx
  1. 检查端口是否监听:
netstat -tlnp | grep -E ':(80|443) '

SSL证书问题

  1. 检查证书文件:
ls -la ./certbot/conf/live/www.omniverseai.net/
  1. 测试证书:
openssl s_client -connect www.omniverseai.net:443 -servername www.omniverseai.net
  1. 手动续期:
docker-compose -f docker-compose.prod.yml run --rm certbot renew --dry-run

新闻服务问题

  1. 检查服务日志:
docker-compose -f docker-compose.prod.yml logs news-crawler
  1. 手动触发爬虫:
curl -X POST http://localhost:3001/api/crawl \
  -H "X-API-Key: your-api-key"
  1. 检查数据库:
docker exec -it omniverse-news-crawler ls -la /app/data

性能优化

Nginx缓存

可以在 nginx/default.conf 中添加缓存配置:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
proxy_cache my_cache;

资源限制

可以在 docker-compose.prod.yml 中添加资源限制:

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M

安全建议

  1. 定期更新Docker镜像
  2. 使用强密码作为API_KEY
  3. 启用防火墙,只开放80和443端口
  4. 定期备份数据
  5. 监控日志中的异常访问
  6. 配置fail2ban防止暴力攻击

联系支持

如遇到问题,请查看:

  • 应用日志:docker-compose logs
  • Nginx日志:/var/log/nginx/(在容器内)
  • 新闻服务日志:./news-crawler-service/logs/