You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

424 lines
7.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 部署指南
## 📋 文档信息
- **文档版本**: 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年 | 初始版本 | 运维团队 |
---
*如有疑问,请联系运维团队*