qiangdanxitong/DEPLOYMENT_GUIDE.md

15 KiB
Raw Blame History

🚀 DesignHub 部署指南

本文档详细说明如何在本地开发环境和生产环境中部署 DesignHub 系统。


📋 目录

  1. 环境要求
  2. 本地开发环境部署
  3. 生产环境部署
  4. Docker部署
  5. 常见问题
  6. 维护与监控

🔧 环境要求

开发环境

组件 版本要求 说明
JDK 17+ 建议使用 OpenJDK 17
Node.js 18+ 建议使用 LTS 版本
MySQL 8.0+ 必须
Redis 6.0+ 建议 7.0+
Maven 3.6+ 后端构建工具
pnpm 8.0+ 前端包管理器(可选npm/yarn)

生产环境

组件 版本要求 配置建议
服务器 Linux CentOS 7+, Ubuntu 20.04+
CPU 4核+ 推荐 8核
内存 8GB+ 推荐 16GB
磁盘 50GB+ SSD推荐
带宽 10Mbps+ 推荐 100Mbps

💻 本地开发环境部署

1. 克隆项目

# 克隆代码仓库
cd /Users/lanmu/Desktop/qiangdanxitong
# 或使用 Git
# git clone <repository_url>

2. 配置数据库

2.1 安装 MySQL 8.0

macOS:

brew install mysql@8.0
brew services start mysql@8.0

Linux:

sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql

Windows:

  • 下载MySQL 8.0安装包
  • 运行安装向导

2.2 创建数据库

-- 登录MySQL
mysql -u root -p

-- 创建数据库
CREATE DATABASE design_hub CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户(可选)
CREATE USER 'designhub'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON design_hub.* TO 'designhub'@'localhost';
FLUSH PRIVILEGES;

2.3 导入数据库表

# 执行数据库脚本(如果有SQL文件)
mysql -u root -p design_hub < database/schema.sql

注意:项目使用MyBatis Plus,实体类会自动映射到数据库表。确保在启动前,数据库连接配置正确。

3. 配置 Redis

3.1 安装 Redis

macOS:

brew install redis
brew services start redis

Linux:

sudo apt install redis-server
sudo systemctl start redis
sudo systemctl enable redis

Windows:

  • 下载Redis for Windows
  • 解压并运行 redis-server.exe

3.2 验证Redis

redis-cli ping
# 应返回:PONG

4. 配置后端

4.1 编辑配置文件

编辑 /backend/src/main/resources/application.yml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/design_hub?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root  # 修改为你的MySQL用户名
    password: your_password  # 修改为你的MySQL密码
    driver-class-name: com.mysql.cj.jdbc.Driver
    
  redis:
    host: localhost
    port: 6379
    password:  # 如果Redis没有密码,留空
    database: 0
    timeout: 3000
    
jwt:
  secret: your-secret-key-change-this-in-production  # 生产环境请修改
  access-token-expiration: 7200000  # 2小时
  refresh-token-expiration: 604800000  # 7天

server:
  port: 8080

4.2 构建并运行后端

cd backend

# 使用 Maven 构建
mvn clean install -DskipTests

# 运行后端
mvn spring-boot:run

# 或者使用 JAR 文件
java -jar target/designhub-backend-1.0.0.jar

后端启动成功标志:

5. 配置前端

5.1 安装依赖

cd frontend

# 使用 pnpm(推荐)
pnpm install

# 或使用 npm
npm install

# 或使用 yarn
yarn install

5.2 配置环境变量

创建 /frontend/.env.development:

# 开发环境配置
VITE_APP_BASE_API=http://localhost:8080/api
VITE_APP_TITLE=DesignHub
VITE_APP_VERSION=6.0

5.3 运行前端

# 开发模式
pnpm dev

# 或
npm run dev

前端启动成功标志:

6. 访问系统

打开浏览器,访问 http://localhost:5173

默认测试账号:

  • 用户名:admin
  • 密码:123456

🌐 生产环境部署

1. 服务器准备

1.1 更新系统

# CentOS/RHEL
sudo yum update -y

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y

1.2 安装必要软件

# 安装 JDK 17
sudo yum install java-17-openjdk -y

# 安装 Nginx
sudo yum install nginx -y

# 安装 Git(如需)
sudo yum install git -y

2. 部署数据库

2.1 安装 MySQL 8.0

# 下载MySQL Yum Repository
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装Repository
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm

# 安装MySQL
sudo yum install mysql-server -y

# 启动MySQL
sudo systemctl start mysqld
sudo systemctl enable mysqld

# 获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log

# 修改root密码
mysql_secure_installation

2.2 创建数据库和用户

CREATE DATABASE design_hub CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'designhub'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON design_hub.* TO 'designhub'@'%';
FLUSH PRIVILEGES;

2.3 导入数据

mysql -u designhub -p design_hub < /path/to/schema.sql

3. 部署 Redis

# 安装Redis
sudo yum install redis -y

# 配置Redis(可选设置密码)
sudo vi /etc/redis.conf
# 找到 requirepass,设置密码
requirepass YourStrongPassword

# 启动Redis
sudo systemctl start redis
sudo systemctl enable redis

4. 部署后端

4.1 上传代码

# 创建应用目录
sudo mkdir -p /opt/designhub/backend
sudo chown -R $USER:$USER /opt/designhub

# 上传代码(使用scp、rsync或git)
# scp方式
scp -r backend/* user@server:/opt/designhub/backend/

# 或使用git
cd /opt/designhub
git clone <repository_url>

4.2 配置生产环境

编辑 /opt/designhub/backend/src/main/resources/application-prod.yml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/design_hub?useSSL=true
    username: designhub
    password: StrongPassword123!
    
  redis:
    host: localhost
    port: 6379
    password: YourStrongPassword
    
jwt:
  secret: change-this-to-a-very-strong-secret-key-in-production
  
logging:
  level:
    root: INFO
    com.designhub: INFO
  file:
    name: /opt/designhub/logs/application.log

4.3 构建后端

cd /opt/designhub/backend

# 构建
mvn clean package -DskipTests -Pprod

# 移动JAR文件
mv target/designhub-backend-1.0.0.jar /opt/designhub/

4.4 创建系统服务

创建 /etc/systemd/system/designhub-backend.service:

[Unit]
Description=DesignHub Backend Service
After=network.target

[Service]
Type=simple
User=designhub
WorkingDirectory=/opt/designhub
ExecStart=/usr/bin/java -jar /opt/designhub/designhub-backend-1.0.0.jar --spring.profiles.active=prod
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

4.5 启动后端服务

# 重新加载systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start designhub-backend

# 设置开机自启
sudo systemctl enable designhub-backend

# 查看状态
sudo systemctl status designhub-backend

# 查看日志
sudo journalctl -u designhub-backend -f

5. 部署前端

5.1 构建前端

cd /opt/designhub/frontend

# 安装依赖
pnpm install --production

# 创建生产环境配置
cat > .env.production << EOF
VITE_APP_BASE_API=https://api.yourdomain.com/api
VITE_APP_TITLE=DesignHub
VITE_APP_VERSION=6.0
EOF

# 构建
pnpm build

# 构建产物在 dist/ 目录

5.2 配置 Nginx

创建 /etc/nginx/conf.d/designhub.conf:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    
    # 前端静态资源
    root /opt/designhub/frontend/dist;
    index index.html;
    
    # 前端路由
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # API代理
    location /api/ {
        proxy_pass http://localhost:8080/api/;
        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;
        
        # WebSocket支持(如需)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # Gzip压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

5.3 配置 HTTPS (Let's Encrypt)

# 安装certbot
sudo yum install certbot python3-certbot-nginx -y

# 获取SSL证书
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# 自动续期测试
sudo certbot renew --dry-run

5.4 启动 Nginx

# 测试配置
sudo nginx -t

# 启动Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

# 重新加载配置
sudo systemctl reload nginx

6. 防火墙配置

# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Ubuntu (ufw)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

🐳 Docker 部署

1. 后端 Dockerfile

创建 /backend/Dockerfile:

FROM openjdk:17-slim

WORKDIR /app

# 复制JAR文件
COPY target/designhub-backend-1.0.0.jar app.jar

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 暴露端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]

2. 前端 Dockerfile

创建 /frontend/Dockerfile:

FROM node:18-alpine AS builder

WORKDIR /app

# 复制package文件
COPY package*.json ./
COPY pnpm-lock.yaml ./

# 安装依赖
RUN npm install -g pnpm
RUN pnpm install

# 复制源代码
COPY . .

# 构建
RUN pnpm build

# 生产环境
FROM nginx:alpine

# 复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html

# 复制Nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

3. Docker Compose

创建 /docker-compose.yml:

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: designhub-mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: design_hub
      MYSQL_USER: designhub
      MYSQL_PASSWORD: designhubpass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - designhub-network
      
  redis:
    image: redis:7-alpine
    container_name: designhub-redis
    command: redis-server --requirepass redispassword
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - designhub-network
      
  backend:
    build: ./backend
    container_name: designhub-backend
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/design_hub
      SPRING_DATASOURCE_USERNAME: designhub
      SPRING_DATASOURCE_PASSWORD: designhubpass
      SPRING_REDIS_HOST: redis
      SPRING_REDIS_PASSWORD: redispassword
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - redis
    networks:
      - designhub-network
      
  frontend:
    build: ./frontend
    container_name: designhub-frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - designhub-network

volumes:
  mysql_data:
  redis_data:

networks:
  designhub-network:
    driver: bridge

4. 启动 Docker Compose

# 构建并启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止所有服务
docker-compose down

# 重启服务
docker-compose restart

❓ 常见问题

1. 后端无法连接数据库

问题:java.sql.SQLException: Access denied for user

解决:

-- 检查用户权限
SELECT User, Host FROM mysql.user;

-- 重新授权
GRANT ALL PRIVILEGES ON design_hub.* TO 'designhub'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

2. Redis连接失败

问题:Could not connect to Redis at localhost:6379

解决:

# 检查Redis是否运行
sudo systemctl status redis

# 检查端口
netstat -tuln | grep 6379

# 测试连接
redis-cli -h localhost -p 6379 -a password ping

3. 前端API请求跨域

问题:CORS policy: No 'Access-Control-Allow-Origin' header

解决:后端添加CORS配置(已在项目中配置)

4. JWT Token过期

问题:频繁退出登录

解决:调整Token过期时间或实现自动刷新机制(已实现)

5. 文件上传失败

问题:上传大文件失败

解决:

# application.yml
spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

🛠️ 维护与监控

1. 日志管理

后端日志

# 查看实时日志
tail -f /opt/designhub/logs/application.log

# 按日期查看
less /opt/designhub/logs/application-2025-11-07.log

# 日志清理(保留30天)
find /opt/designhub/logs -name "*.log" -mtime +30 -delete

Nginx日志

# 访问日志
tail -f /var/log/nginx/access.log

# 错误日志
tail -f /var/log/nginx/error.log

2. 数据库备份

自动备份脚本

创建 /opt/designhub/scripts/backup_db.sh:

#!/bin/bash

# 配置
DB_NAME="design_hub"
DB_USER="designhub"
DB_PASS="password"
BACKUP_DIR="/opt/designhub/backups"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/backup_$DATE.sql

# 压缩备份
gzip $BACKUP_DIR/backup_$DATE.sql

# 删除7天前的备份
find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +7 -delete

echo "Backup completed: backup_$DATE.sql.gz"

设置定时任务

# 编辑crontab
crontab -e

# 每天凌晨2点备份
0 2 * * * /opt/designhub/scripts/backup_db.sh

3. 性能监控

系统资源监控

# CPU和内存
top

# 磁盘使用
df -h

# 网络连接
netstat -tuln

# 进程监控
ps aux | grep java

应用监控

Spring Boot Actuator(已集成):

4. 安全加固

系统安全

# 关闭不必要的服务
sudo systemctl disable bluetooth
sudo systemctl disable cups

# 更新安全补丁
sudo yum update --security -y

# 配置fail2ban
sudo yum install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

应用安全

  • 定期更新依赖版本
  • 使用强密码
  • 启用HTTPS
  • 配置防火墙
  • 定期安全审计

📞 技术支持

如遇到部署问题,请:

  1. 查看本文档"常见问题"部分
  2. 检查日志文件
  3. 联系技术支持团队

祝您部署顺利! 🎉