# XL 监狱综合管理平台部署文档

## 1. 文档概述

本文档详细描述 XL 监狱综合管理平台在服务器 `root@192.168.10.150` 上的部署流程。该平台采用 Docker 容器化部署方式，包含 MySQL 数据库、Redis 缓存、Spring Boot 后端服务和 Nginx 前端服务。

### 1.1 系统架构

```
┌─────────────────────────────────────────────────────────────────────┐
│                         服务器 192.168.10.150                         │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐  │
│  │                    Docker 网络 (xl-prison-network)             │  │
│  │                                                              │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌────────────────────────┐ │  │
│  │  │   MySQL 8   │  │  Redis 6    │  │   后端服务 (Java)      │ │  │
│  │  │  端口:3306  │  │  端口:6379  │  │   端口:48080           │ │  │
│  │  │             │  │             │  │                        │ │  │
│  │  └──────┬──────┘  └──────┬──────┘  └───────────┬────────────┘ │  │
│  │         │                │                      │              │  │
│  │         └────────────────┼──────────────────────┘              │  │
│  │                          │                                     │  │
│  │                   ┌──────┴──────┐                              │  │
│  │                   │   Nginx     │                              │  │
│  │                   │   端口:8080 │                              │  │
│  │                   └──────┬──────┘                              │  │
│  │                          │                                     │  │
│  └──────────────────────────┼─────────────────────────────────────┘  │
│                             │                                        │
│                             ▼                                        │
│                    外部用户访问入口                                   │
│                  http://192.168.10.150:8080                          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
```

### 1.2 端口分配

| 服务 | 端口 | 说明 |
|------|------|------|
| Nginx 前端 | 8080 | Web 访问入口 |
| Spring Boot 后端 | 48080 | API 服务端口 |
| MySQL | 3306 | 数据库服务 |
| Redis | 6379 | 缓存服务 |

### 1.3 环境要求

在开始部署之前，请确保目标服务器满足以下最低要求：

- **操作系统**: CentOS 7+ / Ubuntu 18+ / Rocky Linux 8+ / Debian 10+
- **CPU**: 最低 2 核，推荐 4 核或更多
- **内存**: 最低 4GB，推荐 8GB 或更多
- **硬盘**: 最低 50GB 可用空间，推荐 100GB SSD
- **网络**: 具备互联网访问能力，用于下载 Docker 镜像

## 2. 服务器环境准备

### 2.1 安装 Docker

以下是在 CentOS/Rocky Linux 系统上安装 Docker 的步骤。如果您的服务器已安装 Docker，请跳过此步骤。

```bash
# 1. 安装必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 添加 Docker 官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 3. 安装 Docker 引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 4. 启动 Docker 服务
sudo systemctl start docker

# 5. 设置开机自启动
sudo systemctl enable docker

# 6. 验证安装
docker --version
docker compose version
```

对于 Ubuntu/Debian 系统，请使用以下命令：

```bash
# 1. 更新软件包索引
sudo apt-get update

# 2. 安装必要依赖
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. 设置 Docker 仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装 Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 6. 启动并设置开机自启动
sudo systemctl start docker
sudo systemctl enable docker
```

### 2.2 配置 Docker 镜像加速

为了加速 Docker 镜像的下载，建议配置国内镜像加速器。

```bash
# 创建 Docker 配置目录
sudo mkdir -p /etc/docker

# 配置镜像加速器
sudo tee /etc/docker/daemon.json <<-EOF
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.docker-cn.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep "Registry Mirrors"
```

### 2.3 安装 Git（用于拉取代码）

```bash
# CentOS/Rocky Linux
sudo yum install -y git

# Ubuntu/Debian
sudo apt-get install -y git
```

## 3. 项目部署

### 3.1 创建部署目录结构

在服务器上创建项目部署目录：

```bash
# 创建项目根目录
sudo mkdir -p /work/projects/xl-prison
sudo mkdir -p /work/projects/xl-prison/{backend,frontend,data/{mysql,redis},logs,sql}

# 设置目录所有者（请将 username 替换为实际用户名）
sudo chown -R $USER:$USER /work/projects/xl-prison

# 进入项目目录
cd /work/projects/xl-prison
```

目录结构说明：

```
/work/projects/xl-prison/
├── backend/            # 后端服务目录
│   ├── config/         # 配置文件目录
│   └── Dockerfile      # Docker 构建文件
├── frontend/           # 前端服务目录
│   ├── dist/           # 前端构建产物
│   └── nginx.conf      # Nginx 配置文件
├── data/               # 数据持久化目录
│   ├── mysql/          # MySQL 数据文件
│   └── redis/          # Redis 数据文件
├── logs/               # 日志目录
│   ├── backend/        # 后端日志
│   └── nginx/          # Nginx 日志
├── sql/                # SQL 初始化脚本
├── docker-compose.yml  # Docker Compose 配置
└── README.md          # 部署文档
```

### 3.2 获取项目代码

您可以通过以下两种方式之一获取项目代码：

**方式一：从 Git 仓库克隆**

```bash
cd /work/projects/xl-prison
git clone <your-repository-url> ./source
```

**方式二：从本地复制**

在您的开发机器上执行以下命令，将项目复制到服务器：

```bash
# 复制整个项目到服务器
scp -r /Volumes/Dpan/github/xlcp root@192.168.10.150:/work/projects/xl-prison/source

# 或者只复制必要文件
scp -r /Volumes/Dpan/github/xlcp/backend root@192.168.10.150:/work/projects/xl-prison/
scp -r /Volumes/Dpan/github/xlcp/frontend/dist root@192.168.10.150:/work/projects/xl-prison/frontend/
scp -r /Volumes/Dpan/github/xlcp/backend/sql/mysql/*.sql root@192.168.10.150:/work/projects/xl-prison/sql/
```

### 3.3 复制配置文件

将预先准备好的配置文件复制到服务器：

```bash
# 复制 Docker Compose 配置
cp deploy/docker-compose.yml /work/projects/xl-prison/

# 复制后端配置
cp deploy/config/application-prod.yaml /work/projects/xl-prison/backend/config/

# 复制后端 Dockerfile
cp deploy/docker/backend/Dockerfile /work/projects/xl-prison/backend/

# 复制前端 Nginx 配置
cp deploy/docker/frontend/nginx.conf /work/projects/xl-prison/frontend/

# 复制 SQL 初始化脚本
cp backend/sql/mysql/*.sql /work/projects/xl-prison/sql/
```

### 3.4 编译后端项目

在有 Maven 环境的机器上编译后端项目：

```bash
cd /Volumes/Dpan/github/xlcp/backend

# 清理并打包（跳过测试）
mvn clean package -DskipTests -Dmaven.javadoc.skip=true

# 构建完成后，jar 包位于以下位置
ls -lh yudao-server/target/yudao-server.jar
```

将编译好的 jar 包复制到服务器：

```bash
scp yudao-server/target/yudao-server.jar root@192.168.10.150:/work/projects/xl-prison/backend/
```

### 3.5 构建前端项目

在有 Node.js 环境的机器上构建前端：

```bash
cd /Volumes/Dpan/github/xlcp/frontend

# 安装依赖
pnpm install

# 生产环境构建
pnpm build:prod

# 构建完成后，构建产物在 dist 目录
ls -lh dist/
```

将构建产物复制到服务器：

```bash
scp -r dist/* root@192.168.10.150:/work/projects/xl-prison/frontend/
```

## 4. 配置文件说明

### 4.1 Docker Compose 配置

主要配置项说明：

```yaml
version: "3.8"

services:
  # MySQL 数据库服务
  mysql:
    image: mysql:8.0                    # 使用 MySQL 8.0 镜像
    container_name: xl-prison-mysql     # 容器名称
    restart: unless-stopped             # 异常退出后自动重启
    environment:
      MYSQL_ROOT_PASSWORD: Prison2024!@  # root 用户密码
      MYSQL_DATABASE: prison             # 数据库名称
    volumes:
      - ./data/mysql:/var/lib/mysql     # 数据持久化
      - ./sql:/docker-entrypoint-initdb.d:ro  # 初始化脚本
    ports:
      - "3306:3306"                     # 端口映射
    deploy:
      resources:
        limits:
          memory: 2G                    # 内存限制

  # Redis 缓存服务
  redis:
    image: redis:6.2-alpine
    container_name: xl-prison-redis
    command: redis-server --requirepass Redis2024!@  # 设置密码
    volumes:
      - ./data/redis:/data
    deploy:
      resources:
        limits:
          memory: 512M

  # 后端服务
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: xl-prison-backend
    environment:
      SPRING_PROFILES_ACTIVE: prod  # 生产环境配置
      JAVA_OPTS: -Xms512m -Xmx1024m  # JVM 内存配置
    volumes:
      - ./backend/config:/app/config:ro  # 配置文件挂载
      - ./logs/backend:/app/logs         # 日志目录挂载
    depends_on:
      mysql:
        condition: service_healthy   # 等待 MySQL 健康检查通过
      redis:
        condition: service_healthy   # 等待 Redis 健康检查通过

  # 前端服务
  frontend:
    image: nginx:alpine
    container_name: xl-prison-frontend
    volumes:
      - ./frontend/dist:/usr/share/nginx/html:ro  # 前端静态文件
      - ./frontend/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./logs/nginx:/var/log/nginx              # Nginx 日志
```

### 4.2 后端生产配置

配置文件位置：`backend/config/application-prod.yaml`

主要配置项：

```yaml
spring:
  datasource:
    dynamic:
      datasource:
        master:
          url: jdbc:mysql://mysql:3306/prison?useSSL=false&serverTimezone=Asia/Shanghai...
          username: root
          password: Prison2024!@
  data:
    redis:
      host: redis        # 使用 Docker 网络中的服务名
      port: 6379
      password: Redis2024!@

server:
  port: 48080           # 后端服务端口

logging:
  level:
    cn.iocoder.yudao: DEBUG
```

**重要说明**：在 Docker 环境中，使用 Docker Compose 定义的服务名（如 `mysql`、`redis`）作为主机名，而非 IP 地址。

### 4.3 Nginx 配置

配置文件位置：`frontend/nginx.conf`

主要功能：

- 静态文件服务
- API 请求代理到后端服务
- Gzip 压缩
- 缓存配置
- 安全头配置

```nginx
upstream backend {
    server backend:48080;  # 后端服务地址
    keepalive 32;
}

server {
    listen 80;
    
    # 前端路由支持
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # API 代理
    location /prod-api/ {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
```

## 5. 部署执行

### 5.1 启动服务

```bash
cd /work/projects/xl-prison

# 启动所有服务（后台运行）
docker compose up -d

# 查看启动状态
docker compose ps

# 查看服务日志
docker compose logs -f
```

### 5.2 验证部署

执行以下命令验证各服务是否正常运行：

```bash
# 1. 检查 MySQL
docker exec -it xl-prison-mysql mysql -uroot -pPrison2024!@ -e "SHOW DATABASES;"

# 预期输出应包含 prison 数据库

# 2. 检查 Redis
docker exec -it xl-prison-redis redis-cli -a Redis2024!@ ping

# 预期输出：PONG

# 3. 检查后端健康状态
curl http://localhost:48080/actuator/health/

# 预期输出：{"status":"UP"}

# 4. 检查前端访问
curl -I http://localhost:8080/

# 预期输出：HTTP/1.1 200 OK
```

### 5.3 查看日志

```bash
# 查看后端日志
docker logs xl-prison-backend
tail -f /work/projects/xl-prison/logs/backend/yudao-server.log

# 查看 Nginx 日志
docker logs xl-prison-frontend
tail -f /work/projects/xl-prison/logs/nginx/access.log
tail -f /work/projects/xl-prison/logs/nginx/error.log
```

## 6. 访问地址

部署完成后，系统可通过以下地址访问：

| 服务 | 地址 | 说明 |
|------|------|------|
| 前端页面 | http://192.168.10.150:8080 | 监狱管理系统 Web 界面 |
| 后端 API | http://192.168.10.150:48080 | 后端服务接口 |
| 健康检查 | http://192.168.10.150:48080/actuator/health | 服务健康状态 |
| MySQL | 192.168.10.150:3306 | 数据库连接 |
| Redis | 192.168.10.150:6379 | 缓存服务 |

## 7. 运维管理

### 7.1 服务管理命令

```bash
# 启动所有服务
docker compose start

# 停止所有服务
docker compose stop

# 重启所有服务
docker compose restart

# 重启单个服务
docker compose restart backend
docker compose restart frontend

# 查看服务状态
docker compose ps

# 查看服务资源使用
docker stats

# 进入容器内部
docker exec -it xl-prison-backend /bin/sh
docker exec -it xl-prison-mysql mysql -uroot -pPrison2024!@
docker exec -it xl-prison-redis redis-cli -a Redis2024!@
```

### 7.2 日志管理

```bash
# 查看所有服务日志
docker compose logs

# 查看指定服务日志
docker compose logs backend
docker compose logs frontend
docker compose logs mysql
docker compose logs redis

# 实时查看日志
docker compose logs -f

# 查看最近 100 行日志
docker logs --tail 100 xl-prison-backend
```

### 7.3 数据备份

```bash
# 备份 MySQL 数据库
BACKUP_DIR=/work/projects/xl-prison/backup
mkdir -p $BACKUP_DIR
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)

docker exec xl-prison-mysql mysqldump -uroot -pPrison2024!@ prison > $BACKUP_DIR/prison_$BACKUP_DATE.sql

# 压缩备份文件
gzip $BACKUP_DIR/prison_$BACKUP_DATE.sql

# 查看备份文件
ls -lh $BACKUP_DIR/

# 备份 Redis 数据
docker exec xl-prison-redis redis-cli -a Redis2024!@ BGSAVE
docker cp xl-prison-redis:/data/dump.rdb $BACKUP_DIR/redis_$BACKUP_DATE.rdb
```

### 7.4 版本更新

```bash
# 1. 停止当前服务
cd /work/projects/xl-prison
docker compose down

# 2. 备份重要数据
cp -r data data.backup.$(date +%Y%m%d)

# 3. 更新代码
cd source
git pull

# 4. 重新编译
cd ../backend
mvn clean package -DskipTests
cd ../frontend
pnpm install && pnpm build:prod

# 5. 更新构建产物
cp -r dist/* ../frontend/
cp target/*.jar ../backend/

# 6. 重新构建镜像并启动
cd ..
docker compose build --no-cache
docker compose up -d

# 7. 验证部署
curl http://localhost:48080/actuator/health/
```

## 8. 常见问题排查

### 8.1 后端无法连接数据库

```bash
# 检查 MySQL 容器状态
docker ps | grep mysql

# 检查 MySQL 日志
docker logs xl-prison-mysql

# 检查 MySQL 健康状态
docker exec xl-prison-mysql mysqladmin -uroot -pPrison2024!@ ping

# 检查网络连接
docker exec xl-prison-backend ping mysql

# 常见原因及解决方案：
# 1. MySQL 容器未启动 → docker compose restart mysql
# 2. 密码错误 → 检查 application-prod.yaml 配置
# 3. 网络问题 → 检查 Docker 网络状态
```

### 8.2 前端 502 错误

```bash
# 检查后端服务状态
docker ps | grep backend

# 检查后端健康状态
curl http://localhost:48080/actuator/health/

# 检查后端日志
docker logs xl-prison-backend

# 检查 Nginx 配置
docker exec xl-prison-frontend cat /etc/nginx/nginx.conf

# 测试后端连通性
docker exec xl-prison-frontend curl http://backend:48080/actuator/health/
```

### 8.3 内存不足

```bash
# 检查容器资源使用情况
docker stats

# 调整 JVM 内存配置，编辑 docker-compose.yml
environment:
  JAVA_OPTS: -Xms256m -Xmx512m

# 重新启动服务
docker compose restart backend
```

### 8.4 端口冲突

```bash
# 检查端口占用
netstat -tlnp | grep 8080
netstat -tlnp | grep 48080

# 如果端口被占用，可以修改 docker-compose.yml 中的端口映射
ports:
  - "8081:80"  # 改为 8081 端口
```

### 8.5 数据丢失

```bash
# 检查数据卷挂载
docker volume ls

# 检查数据目录权限
ls -la /work/projects/xl-prison/data/

# 恢复数据（从备份）
gunzip -k /work/projects/xl-prison/backup/prison_20240115.sql.gz
docker exec -i xl-prison-mysql mysql -uroot -pPrison2024!@ prison < /work/projects/xl-prison/backup/prison_20240115.sql
```

## 9. 安全加固建议

### 9.1 修改默认密码

生产环境中，请务必修改默认密码：

```yaml
# MySQL
MYSQL_ROOT_PASSWORD: YourStrongPassword123!@

# Redis
command: redis-server --requirepass YourStrongRedisPassword456!@

# 修改 application-prod.yaml 中的数据库密码
password: YourStrongPassword123!@
```

### 9.2 配置防火墙

```bash
# 只开放必要端口（CentOS）
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=48080/tcp
firewall-cmd --reload

# 只开放必要端口（Ubuntu）
sudo ufw allow 8080/tcp
sudo ufw allow 48080/tcp
sudo ufw enable
```

### 9.3 启用 HTTPS（推荐）

建议使用 Nginx 反向代理并配置 SSL 证书：

```nginx
server {
    listen 443 ssl http2;
    server_name your-domain.com;
    
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # 其他配置...
}

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

### 9.4 定期安全更新

```bash
# 更新系统软件包
sudo yum update -y  # CentOS
sudo apt-get update && sudo apt-get upgrade -y  # Ubuntu

# 更新 Docker
sudo yum update docker-ce  # CentOS
sudo apt-get update && sudo apt-get install docker-ce  # Ubuntu
```

### 9.5 监控与告警

建议配置以下监控：

- **服务监控**: 使用 Prometheus + Grafana 监控容器状态
- **日志监控**: 使用 ELK Stack 收集和分析日志
- **告警通知**: 配置邮件或企业微信告警通知

## 10. 联系与支持

如果在部署过程中遇到问题，请：

1. 查看本文档的常见问题排查章节
2. 检查各服务的日志文件
3. 联系系统管理员获取支持

---

**文档版本**: 1.0.0  
**最后更新**: 2026年1月21日  
**适用系统**: XL 监狱综合管理平台 v1.0
