# 部署指南 ## 📋 文档信息 - **文档版本**: v1.0.0 - **创建日期**: 2024年 - **最后更新**: 2024年 - **文档状态**: 草稿 - **维护人员**: 运维团队 ## 🎯 部署概述 本文档描述了 Getinge Web 项目的部署流程,包括环境准备、构建打包、部署配置等步骤。 ## 🛠️ 环境要求 ### 服务器环境 - **操作系统**: Ubuntu 18.04+ / CentOS 7+ / Windows Server 2016+ - **Node.js**: 版本 16.x LTS - **Nginx**: 版本 1.18+ - **内存**: 4GB+ - **硬盘**: 20GB+ 可用空间 ### 网络要求 - 公网 IP 地址 - 域名解析配置 - SSL 证书(HTTPS) - 防火墙端口开放(80, 443, 3000) ## 🚀 部署流程 ### 1. 环境准备 #### 安装 Node.js ```bash # Ubuntu/Debian curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs # CentOS/RHEL curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - sudo yum install -y nodejs # 验证安装 node --version npm --version ``` #### 安装 Nginx ```bash # Ubuntu/Debian sudo apt-get update sudo apt-get install nginx # CentOS/RHEL sudo yum install epel-release sudo yum install nginx # 启动 Nginx sudo systemctl start nginx sudo systemctl enable nginx ``` #### 安装 PM2 ```bash # 全局安装 PM2 sudo npm install -g pm2 # 验证安装 pm2 --version ``` ### 2. 项目部署 #### 克隆项目 ```bash # 创建部署目录 sudo mkdir -p /var/www/getinge-web sudo chown $USER:$USER /var/www/getinge-web # 克隆项目 cd /var/www/getinge-web git clone <项目仓库地址> . # 安装依赖 npm install --production ``` #### 环境配置 ```bash # 创建环境配置文件 cp .env.example .env # 编辑环境配置 nano .env # 配置内容示例 NODE_ENV=production PORT=3000 API_BASE_URL=https://api.example.com JWT_SECRET=your-secret-key ``` #### 构建项目 ```bash # 安装构建依赖 npm install # 构建生产版本 npm run build:prod # 验证构建结果 ls -la dist/ ``` ### 3. 服务配置 #### PM2 配置 ```bash # 创建 PM2 配置文件 nano ecosystem.config.js # 配置文件内容 module.exports = { apps: [{ name: 'getinge-web', script: 'server.js', instances: 'max', exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000 }, error_file: './logs/err.log', out_file: './logs/out.log', log_file: './logs/combined.log', time: true }] }; # 启动服务 pm2 start ecosystem.config.js pm2 save pm2 startup ``` #### Nginx 配置 ```bash # 创建 Nginx 配置文件 sudo nano /etc/nginx/sites-available/getinge-web # 配置文件内容 server { listen 80; server_name your-domain.com; # 重定向到 HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; # SSL 配置 ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; # 静态文件缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } # API 代理 location /api/ { 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_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } # 前端应用 location / { root /var/www/getinge-web/dist; try_files $uri $uri/ /index.html; # 安全头 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; } } # 启用站点 sudo ln -s /etc/nginx/sites-available/getinge-web /etc/nginx/sites-enabled/ # 测试配置 sudo nginx -t # 重启 Nginx sudo systemctl restart nginx ``` ### 4. SSL 证书配置 #### Let's Encrypt 证书 ```bash # 安装 Certbot sudo apt-get install certbot python3-certbot-nginx # 获取证书 sudo certbot --nginx -d your-domain.com # 自动续期 sudo crontab -e # 添加以下行 0 12 * * * /usr/bin/certbot renew --quiet ``` ## 🔧 环境配置 ### 开发环境 ```bash # 环境变量 NODE_ENV=development PORT=8080 API_BASE_URL=http://localhost:3000 DEBUG=true ``` ### 测试环境 ```bash # 环境变量 NODE_ENV=testing PORT=3000 API_BASE_URL=https://test-api.example.com DEBUG=false ``` ### 生产环境 ```bash # 环境变量 NODE_ENV=production PORT=3000 API_BASE_URL=https://api.example.com DEBUG=false ``` ## 📊 监控配置 ### PM2 监控 ```bash # 查看应用状态 pm2 status # 查看日志 pm2 logs getinge-web # 监控面板 pm2 monit # 重启应用 pm2 restart getinge-web ``` ### 系统监控 ```bash # 安装监控工具 sudo apt-get install htop iotop nethogs # 查看系统资源 htop iotop nethogs ``` ### 日志管理 ```bash # 创建日志目录 mkdir -p /var/www/getinge-web/logs # 配置日志轮转 sudo nano /etc/logrotate.d/getinge-web # 配置内容 /var/www/getinge-web/logs/*.log { daily missingok rotate 52 compress delaycompress notifempty create 644 www-data www-data postrotate pm2 reloadLogs endscript } ``` ## 🚀 自动化部署 ### CI/CD 配置 ```yaml # .github/workflows/deploy.yml name: Deploy to Production on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: '16' - name: Install dependencies run: npm ci - name: Build project run: npm run build:prod - name: Deploy to server uses: appleboy/ssh-action@v0.1.4 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} script: | cd /var/www/getinge-web git pull origin main npm install --production npm run build:prod pm2 restart getinge-web ``` ### 部署脚本 ```bash #!/bin/bash # deploy.sh echo "开始部署..." # 拉取最新代码 git pull origin main # 安装依赖 npm install --production # 构建项目 npm run build:prod # 重启服务 pm2 restart getinge-web echo "部署完成!" ``` ## 🔍 故障排查 ### 常见问题 #### 服务无法启动 ```bash # 检查端口占用 sudo netstat -tlnp | grep :3000 # 检查日志 pm2 logs getinge-web # 检查环境变量 pm2 env getinge-web ``` #### 静态文件无法访问 ```bash # 检查文件权限 ls -la /var/www/getinge-web/dist/ # 检查 Nginx 配置 sudo nginx -t # 检查 Nginx 状态 sudo systemctl status nginx ``` #### SSL 证书问题 ```bash # 检查证书状态 sudo certbot certificates # 手动续期 sudo certbot renew --dry-run # 检查证书文件 sudo ls -la /etc/letsencrypt/live/your-domain.com/ ``` ## 📝 变更记录 | 版本 | 日期 | 变更内容 | 变更人 | |------|------|----------|--------| | v1.0.0 | 2024年 | 初始版本 | 运维团队 | --- *如有疑问,请联系运维团队*