# Lyzsys 部署指南

## 📖 目录

- [部署概述](#部署概述)
- [环境准备](#环境准备)
- [后端部署](#后端部署)
- [前端部署](#前端部署)
- [数据库部署](#数据库部署)
- [缓存部署](#缓存部署)
- [文件存储部署](#文件存储部署)
- [生产环境部署](#生产环境部署)
- [容器化部署](#容器化部署)
- [监控部署](#监控部署)

---

## 部署概述

### 部署架构

```
┌─────────────────────────────────────────────────────────────┐
│                        用户端                                │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │   PC 浏览器   │  │  移动 App    │  │  小程序      │      │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                        Nginx                                 │
│                  (反向代理 + 静态资源)                        │
└─────────────────────────────────────────────────────────────┘
                              │
                ┌─────────────┴─────────────┐
                │                           │
                ▼                           ▼
┌──────────────────────────┐    ┌──────────────────────────┐
│      前端静态资源          │    │       后端 API 服务       │
│   (Vue3 SPA 应用)         │    │    (Spring Boot 应用)     │
└──────────────────────────┘    └──────────────────────────┘
                                          │
                ┌─────────────────────────┼─────────────────────────┐
                │                         │                         │
                ▼                         ▼                         ▼
┌──────────────────┐    ┌──────────────────┐    ┌──────────────────┐
│      MySQL       │    │      Redis       │    │     MinIO        │
│   (主数据库)      │    │    (缓存/会话)    │    │   (文件存储)      │
└──────────────────┘    └──────────────────┘    └──────────────────┘
```

### 部署方式

1. **传统部署**: 直接在服务器上部署
2. **Docker 部署**: 使用 Docker 容器部署
3. **Kubernetes 部署**: 使用 K8s 编排部署

---

## 环境准备

### 服务器要求

#### 最低配置

| 组件 | CPU | 内存 | 硬盘 |
|------|-----|------|------|
| 后端服务 | 2核 | 4GB | 20GB |
| MySQL | 1核 | 2GB | 50GB |
| Redis | 1核 | 1GB | 10GB |
| 前端 | 1核 | 1GB | 10GB |

#### 推荐配置

| 组件 | CPU | 内存 | 硬盘 |
|------|-----|------|------|
| 后端服务 | 4核 | 8GB | 50GB |
| MySQL | 4核 | 16GB | 500GB |
| Redis | 2核 | 4GB | 50GB |
| 前端 | 2核 | 2GB | 20GB |

### 软件要求

| 软件 | 版本 | 用途 |
|------|------|------|
| JDK | 8+ | 后端运行环境 |
| MySQL | 5.7+ / 8.0+ | 数据库 |
| Redis | 5.0+ | 缓存 |
| Nginx | 1.18+ | Web 服务器 |
| Node.js | 16+ | 前端构建 |
| Docker | 20.10+ | 容器化（可选） |

---

## 后端部署

### 方式一: JAR 包部署

#### 1. 打包项目

```bash
cd lyzsys_backend
mvn clean package -DskipTests
```

生成的 JAR 包位于 `lyzsys-server/target/lyzsys-server.jar`

#### 2. 上传文件

将 JAR 包上传到服务器：

```bash
scp lyzsys-server/target/lyzsys-server.jar user@server:/opt/lyzsys/
```

#### 3. 配置文件

创建配置文件 `application-prod.yaml`:

```yaml
spring:
  # 数据源配置
  datasource:
    url: jdbc:mysql://mysql-server:3306/lyzsys?useSSL=false&serverTimezone=Asia/Shanghai
    username: lyzsys
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

  # Redis 配置
  redis:
    host: redis-server
    port: 6379
    database: 1
    password: your_redis_password

# 项目配置
lyzsys:
  web:
    api-prefix: /admin-api
  security:
    mock-enable: false
  upload:
    base-url: http://your-domain.com
```

#### 4. 启动服务

```bash
# 启动服务
java -jar lyzsys-server.jar --spring.profiles.active=prod

# 后台启动
nohup java -jar lyzsys-server.jar --spring.profiles.active=prod > lyzsys.log 2>&1 &

# 指定内存启动
java -Xms512m -Xmx1024m -jar lyzsys-server.jar --spring.profiles.active=prod
```

#### 5. 创建系统服务

创建 `/etc/systemd/system/lyzsys.service`:

```ini
[Unit]
Description=Lyzsys Server
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/bin/java -jar /opt/lyzsys/lyzsys-server.jar --spring.profiles.active=prod
ExecStop=/bin/kill -15 $MAINPID
User=lyzsys
Group=lyzsys
WorkingDirectory=/opt/lyzsys
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```

启动服务：

```bash
# 重载配置
systemctl daemon-reload

# 启动服务
systemctl start lyzsys

# 开机启动
systemctl enable lyzsys

# 查看状态
systemctl status lyzsys
```

### 方式二: Docker 部署

#### 1. 创建 Dockerfile

创建 `Dockerfile`:

```dockerfile
FROM openjdk:8-jre-slim

LABEL maintainer="lyzsys"

# 设置工作目录
WORKDIR /opt/lyzsys

# 复制 JAR 包
COPY lyzsys-server/target/lyzsys-server.jar app.jar

# 暴露端口
EXPOSE 48080

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]
```

#### 2. 构建镜像

```bash
docker build -t lyzsys/lyzsys-server:latest .
```

#### 3. 运行容器

```bash
docker run -d \
  --name lyzsys-server \
  -p 48080:48080 \
  -e SPRING_PROFILES_ACTIVE=prod \
  -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/lyzsys \
  -e SPRING_DATASOURCE_USERNAME=lyzsys \
  -e SPRING_DATASOURCE_PASSWORD=your_password \
  -e SPRING_DATA_REDIS_HOST=redis \
  -e SPRING_DATA_REDIS_PASSWORD=your_redis_password \
  lyzsys/lyzsys-server:latest
```

#### 4. 使用 Docker Compose

创建 `docker-compose.yml`:

```yaml
version: '3.8'

services:
  lyzsys-server:
    image: lyzsys/lyzsys-server:latest
    container_name: lyzsys-server
    ports:
      - "48080:48080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/lyzsys
      - SPRING_DATASOURCE_USERNAME=lyzsys
      - SPRING_DATASOURCE_PASSWORD=your_password
      - SPRING_DATA_REDIS_HOST=redis
      - SPRING_DATA_REDIS_PASSWORD=your_redis_password
    depends_on:
      - mysql
      - redis
    restart: always
```

启动：

```bash
docker-compose up -d
```

---

## 前端部署

### 方式一: Nginx 部署

#### 1. 构建项目

```bash
cd lyzsys-ui-admin

# 安装依赖
pnpm install

# 构建生产版本
pnpm build:prod
```

生成的文件位于 `dist/` 目录

#### 2. 上传文件

将 `dist/` 目录上传到服务器：

```bash
scp -r dist/* user@server:/var/www/lyzsys/
```

#### 3. 配置 Nginx

创建 Nginx 配置 `/etc/nginx/conf.d/lyzsys.conf`:

```nginx
server {
    listen 80;
    server_name your-domain.com;

    root /var/www/lyzsys;
    index index.html;

    # 前端路由
    location / {
        try_files $uri $uri/ /index.html;
    }

    # API 代理
    location /admin-api/ {
        proxy_pass http://localhost:48080/admin-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;
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    gzip_min_length 1024;
}
```

#### 4. 重启 Nginx

```bash
nginx -t
nginx -s reload
```

### 方式二: Docker 部署

#### 1. 创建 Dockerfile

创建 `Dockerfile`:

```dockerfile
FROM nginx:alpine

# 复制构建文件
COPY dist/ /usr/share/nginx/html/

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

# 暴露端口
EXPOSE 80

# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
```

#### 2. 构建镜像

```bash
docker build -t lyzsys/lyzsys-ui-admin:latest .
```

#### 3. 运行容器

```bash
docker run -d \
  --name lyzsys-ui-admin \
  -p 80:80 \
  lyzsys/lyzsys-ui-admin:latest
```

---

## 数据库部署

### MySQL 部署

#### 1. 安装 MySQL

```bash
# CentOS/RHEL
yum install -y mysql-server

# Ubuntu/Debian
apt-get install -y mysql-server
```

#### 2. 配置 MySQL

编辑 `/etc/my.cnf`:

```ini
[mysqld]
# 基础配置
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 连接配置
max_connections = 500
max_connect_errors = 100

# 缓存配置
innodb_buffer_pool_size = 1G
query_cache_size = 128M

# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
```

#### 3. 创建数据库

```bash
mysql -u root -p

CREATE DATABASE lyzsys CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lyzsys'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON lyzsys.* TO 'lyzsys'@'%';
FLUSH PRIVILEGES;
```

#### 4. 导入数据

```bash
mysql -u lyzsys -p lyzsys < lyzsys.sql
```

### Docker 部署 MySQL

```bash
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=root_password \
  -e MYSQL_DATABASE=lyzsys \
  -e MYSQL_USER=lyzsys \
  -e MYSQL_PASSWORD=your_password \
  -v /data/mysql:/var/lib/mysql \
  mysql:8.0
```

---

## 缓存部署

### Redis 部署

#### 1. 安装 Redis

```bash
# CentOS/RHEL
yum install -y redis

# Ubuntu/Debian
apt-get install -y redis-server
```

#### 2. 配置 Redis

编辑 `/etc/redis/redis.conf`:

```ini
# 绑定地址
bind 0.0.0.0

# 端口
port 6379

# 密码
requirepass your_redis_password

# 持久化
save 900 1
save 300 10
save 60 10000

# 最大内存
maxmemory 1gb
maxmemory-policy allkeys-lru
```

#### 3. 启动 Redis

```bash
# 启动 Redis
redis-server /etc/redis/redis.conf

# 或使用 systemd
systemctl start redis
systemctl enable redis
```

### Docker 部署 Redis

```bash
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /data/redis:/data \
  redis:7-alpine \
  redis-server --appendonly yes --requirepass your_redis_password
```

---

## 文件存储部署

### MinIO 部署

#### 1. Docker 部署 MinIO

```bash
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e MINIO_ROOT_USER=admin \
  -e MINIO_ROOT_PASSWORD=admin123 \
  -v /data/minio:/data \
  minio/minio server /data --console-address ":9001"
```

#### 2. 配置 MinIO

1. 访问 http://localhost:9001
2. 登录（admin / admin123）
3. 创建 Bucket: `lyzsys`
4. 创建 Access Key 和 Secret Key
5. 配置后端 `application.yaml`:

```yaml
lyzsys:
  storage:
    minio:
      endpoint: http://localhost:9000
      access-key: your_access_key
      secret-key: your_secret_key
      bucket-name: lyzsys
```

---

## 生产环境部署

### 安全配置

#### 1. 配置防火墙

```bash
# 开放必要端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=48080/tcp
firewall-cmd --reload
```

#### 2. 配置 SSL 证书

使用 Let's Encrypt 免费证书：

```bash
# 安装 certbot
yum install -y certbot

# 获取证书
certbot certonly --standalone -d your-domain.com

# 证书位置
# /etc/letsencrypt/live/your-domain.com/fullchain.pem
# /etc/letsencrypt/live/your-domain.com/privkey.pem
```

配置 Nginx SSL：

```nginx
server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # ... 其他配置
}

# HTTP 跳转 HTTPS
server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$server_name$request_uri;
}
```

### 性能优化

#### 1. MySQL 优化

```ini
# my.cnf
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
```

#### 2. Redis 优化

```ini
# redis.conf
maxmemory 2gb
maxmemory-policy allkeys-lru
save ""
```

#### 3. JVM 优化

```bash
java -Xms2g -Xmx2g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/opt/lyzsys/logs/ \
  -jar lyzsys-server.jar
```

---

## 容器化部署

### Docker Compose 完整部署

创建 `docker-compose.yml`:

```yaml
version: '3.8'

services:
  # MySQL
  mysql:
    image: mysql:8.0
    container_name: lyzsys-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root_password
      - MYSQL_DATABASE=lyzsys
      - MYSQL_USER=lyzsys
      - MYSQL_PASSWORD=your_password
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: always

  # Redis
  redis:
    image: redis:7-alpine
    container_name: lyzsys-redis
    command: redis-server --appendonly yes --requirepass your_redis_password
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    restart: always

  # MinIO
  minio:
    image: minio/minio
    container_name: lyzsys-minio
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=admin123
    volumes:
      - minio-data:/data
    ports:
      - "9000:9000"
      - "9001:9001"
    command: server /data --console-address ":9001"
    restart: always

  # 后端服务
  backend:
    image: lyzsys/lyzsys-server:latest
    container_name: lyzsys-backend
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/lyzsys
      - SPRING_DATASOURCE_USERNAME=lyzsys
      - SPRING_DATASOURCE_PASSWORD=your_password
      - SPRING_DATA_REDIS_HOST=redis
      - SPRING_DATA_REDIS_PASSWORD=your_redis_password
    ports:
      - "48080:48080"
    depends_on:
      - mysql
      - redis
    restart: always

  # 前端服务
  frontend:
    image: lyzsys/lyzsys-ui-admin:latest
    container_name: lyzsys-frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: always

volumes:
  mysql-data:
  redis-data:
  minio-data:
```

启动：

```bash
docker-compose up -d
```

---

## 监控部署

### Spring Boot Admin

#### 1. 添加依赖

```xml
<dependency>
  <groupId>de.codecentric</groupId>
  <artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
```

#### 2. 配置应用

```yaml
spring:
  application:
    name: lyzsys-admin-server

server:
  port: 48081
```

#### 3. 客户端配置

```yaml
spring:
  boot:
    admin:
      client:
        url: http://localhost:48081
```

### SkyWalking

#### 1. 安装 SkyWalking

```bash
docker run -d \
  --name skywalking \
  -p 11800:11800 \
  -p 12800:12800 \
  apache/skywalking-oap-server
```

#### 2. 配置 Agent

```bash
java -javaagent:/path/to/skywalking-agent.jar \
  -Dskywalking.agent.service_name=lyzsys \
  -Dskywalking.collector.backend_service=localhost:11800 \
  -jar lyzsys-server.jar
```

---

**文档版本**: v1.0.0
**最后更新**: 2025-01-19
**维护团队**: Lyzsys 运维团队
