chore: 添加部署配置及文档
- 新增 deploy/ 目录包含 Docker 部署配置、数据库脚本、部署脚本 - 更新 .gitignore 忽略 deploy 构建产物 - 添加 AGENTS.md AI Agent 指南 - 添加项目构建脚本 build.sh
This commit is contained in:
parent
c3d172a5d9
commit
bc40155ef0
9
.cursor/rules/usecluade.mdc
Normal file
9
.cursor/rules/usecluade.mdc
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: usecluade
|
||||||
|
description: This is a new rule
|
||||||
|
---
|
||||||
|
|
||||||
|
# Overview
|
||||||
|
|
||||||
|
Insert overview text here. The agent will only see this should they choose to apply the rule.
|
||||||
|
请使用CLAUDE.md中的规则来回答问题。
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@ -14,6 +14,13 @@ Thumbs.db
|
|||||||
.history/
|
.history/
|
||||||
codegen/
|
codegen/
|
||||||
|
|
||||||
|
# ========== Deploy ==========
|
||||||
|
deploy/xlcp-images/
|
||||||
|
deploy/data/
|
||||||
|
deploy/logs/
|
||||||
|
deploy/*/target/
|
||||||
|
deploy/*/dist/
|
||||||
|
|
||||||
# ========== Frontend (separate repo) ==========
|
# ========== Frontend (separate repo) ==========
|
||||||
frontend/
|
frontend/
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|||||||
154
AGENTS.md
Normal file
154
AGENTS.md
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
This file provides guidance for AI agents working on the XL Prison Management System codebase.
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
XL监狱综合管理平台 - A prison management platform built on the Yudao (芋道) framework.
|
||||||
|
|
||||||
|
**Tech Stack**: Java 17, Spring Boot 3.5.9, MyBatis-Plus, Vue 3.5.12, TypeScript 5.3.3, Element Plus, MySQL 8.0+
|
||||||
|
|
||||||
|
## Essential Commands
|
||||||
|
|
||||||
|
### Backend (Maven)
|
||||||
|
```bash
|
||||||
|
# Build all modules
|
||||||
|
cd backend && mvn clean install -DskipTests
|
||||||
|
|
||||||
|
# Build prison module only
|
||||||
|
cd backend/yudao-module-prison && mvn clean package
|
||||||
|
|
||||||
|
# Run dev server (port 48080)
|
||||||
|
cd backend/yudao-server && mvn spring-boot:run
|
||||||
|
|
||||||
|
# Run all tests
|
||||||
|
cd backend/yudao-module-prison && mvn test
|
||||||
|
|
||||||
|
# Run single test class
|
||||||
|
mvn test -Dtest=PrisonAreaControllerTest
|
||||||
|
|
||||||
|
# Force update dependencies
|
||||||
|
mvn clean install -U
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend (pnpm)
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# Dev server (local mode)
|
||||||
|
pnpm dev
|
||||||
|
|
||||||
|
# TypeScript checking
|
||||||
|
pnpm ts:check
|
||||||
|
|
||||||
|
# Build for different environments
|
||||||
|
pnpm build:local # Uses .env.local
|
||||||
|
pnpm build:dev # Uses .env.dev
|
||||||
|
pnpm build:prod # Uses .env.prod
|
||||||
|
|
||||||
|
# Linting
|
||||||
|
pnpm lint:eslint # ESLint check & fix (.js,.ts,.vue)
|
||||||
|
pnpm lint:format # Prettier format
|
||||||
|
pnpm lint:style # Stylelint fix
|
||||||
|
```
|
||||||
|
|
||||||
|
### Quick Start with Make
|
||||||
|
```bash
|
||||||
|
make frontend # Start frontend dev server
|
||||||
|
make backend # Start backend dev server
|
||||||
|
make run # Start both
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Style Guidelines
|
||||||
|
|
||||||
|
### Java (Backend)
|
||||||
|
|
||||||
|
**Imports**: Grouped by: Spring → Yudao → Third-party → Java stdlib. No wildcard imports.
|
||||||
|
|
||||||
|
**Naming Conventions**:
|
||||||
|
- Classes: PascalCase (e.g., `PrisonAreaController`, `ScoreDO`)
|
||||||
|
- Variables/Methods: camelCase (e.g., `getPage()`, `updateTime`)
|
||||||
|
- Constants: UPPER_SNAKE_CASE (e.g., `DEFAULT_PAGE_SIZE`)
|
||||||
|
- Package: `cn.iocoder.yudao.module.prison.{module}`
|
||||||
|
|
||||||
|
**VO Naming**: `SaveReqVO`, `PageReqVO`, `RespVO` suffixes required.
|
||||||
|
|
||||||
|
**Annotations**: Place on separate lines. Order: `@RestController` → `@RequestMapping` → `@Tag` → `@PreAuthorize`.
|
||||||
|
|
||||||
|
**Error Handling**: Use `CommonResult<T>` return type. Throw `ServiceException` for business errors with error codes from `ErrorCodeConstants`.
|
||||||
|
|
||||||
|
**Comments**: No comments unless explaining complex business logic. Javadoc only on public APIs.
|
||||||
|
|
||||||
|
### TypeScript/Vue (Frontend)
|
||||||
|
|
||||||
|
**Imports**: Sorted alphabetically. No unused imports. Use absolute imports (`@/`).
|
||||||
|
|
||||||
|
**Naming**:
|
||||||
|
- Interfaces: PascalCase (e.g., `Area`, `QuestionnaireRecord`)
|
||||||
|
- Variables/Props: camelCase
|
||||||
|
- Components: PascalCase file names, kebab-case usage
|
||||||
|
|
||||||
|
**Types**: Avoid `any`. Use explicit types or `unknown` for union types.
|
||||||
|
|
||||||
|
**Vue Composition API**: Use `<script setup lang="ts">`. Use composables from `@/hooks`.
|
||||||
|
|
||||||
|
**Formatting**: Use Prettier (80 char line width). Vue single-file components: `<script>` → `<template>` → `<style>`.
|
||||||
|
|
||||||
|
**Error Handling**: Wrap async API calls in try/catch with user feedback.
|
||||||
|
|
||||||
|
## Architecture Patterns
|
||||||
|
|
||||||
|
### Backend Structure
|
||||||
|
```
|
||||||
|
controller/admin/{module}/ # REST API + VOs
|
||||||
|
service/{module}/ # Business logic
|
||||||
|
dal/dataobject/{module}/ # MyBatis-Plus entities
|
||||||
|
dal/mysql/{module}/ # Mappers
|
||||||
|
convert/{module}/ # MapStruct converters
|
||||||
|
enums/ # Enum definitions
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend Structure
|
||||||
|
```
|
||||||
|
views/prison/{module}/ # Page components
|
||||||
|
api/prison/{module}/ # API definitions + types
|
||||||
|
types/ # Shared TypeScript types
|
||||||
|
hooks/ # Composables
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Flow
|
||||||
|
Vue Component → API Layer → Controller → Service → Mapper → MySQL
|
||||||
|
|
||||||
|
## Database Conventions
|
||||||
|
|
||||||
|
- Table prefix: `prison_{module}` (e.g., `prison_area`, `prison_score`)
|
||||||
|
- Common fields: `id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`
|
||||||
|
- Soft delete via `deleted` bit(1) field
|
||||||
|
- Use existing SQL migration scripts in `backend/sql/`
|
||||||
|
|
||||||
|
## API Conventions
|
||||||
|
|
||||||
|
- Base path: `/admin-api/prison/{module}`
|
||||||
|
- Permission pattern: `prison:{module}:{action}` (e.g., `prison:area:create`)
|
||||||
|
- Mock auth: `Authorization: Bearer emsoft{userId}` + `tenant-id: 1` header
|
||||||
|
|
||||||
|
## Cursor Rules
|
||||||
|
|
||||||
|
- Follow CLAUDE.md for technical decisions
|
||||||
|
- Reference `.cursor/rules/usecluade.mdc` for Chinese language context
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
- Backend tests: `src/test/java/...` with `-Test` suffix
|
||||||
|
- Run specific test: `mvn test -Dtest=ClassName`
|
||||||
|
- Frontend: Manual testing via `pnpm dev` + browser dev tools
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- Never commit secrets or credentials
|
||||||
|
- Use mock mode for API testing (enabled in `application-local.yaml`)
|
||||||
|
- Default backend port: 48080
|
||||||
|
- Use `pnpm` for frontend, not `npm` or `yarn`
|
||||||
2
backend
2
backend
@ -1 +1 @@
|
|||||||
Subproject commit 1eb543d803888ddf4d98260776032ad9829b5b3c
|
Subproject commit f252c69dd2c2d20c4112ee62ee86a0fb1a09fc62
|
||||||
162
build.sh
Normal file
162
build.sh
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# XL监狱综合管理平台 - 前后端编译脚本
|
||||||
|
# ============================================
|
||||||
|
# 功能:
|
||||||
|
# 1. 编译后端 Java 项目
|
||||||
|
# 2. 编译前端 Vue3 项目
|
||||||
|
# 3. 生成部署包
|
||||||
|
#
|
||||||
|
# 使用方法:
|
||||||
|
# 1. 修改下面的配置(可选)
|
||||||
|
# 2. 执行: bash build.sh
|
||||||
|
#
|
||||||
|
# 依赖:
|
||||||
|
# - Maven 3.8+
|
||||||
|
# - Node.js 16+
|
||||||
|
# - pnpm
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
PROJECT_DIR="/Volumes/Dpan/github/xlcp"
|
||||||
|
BACKEND_DIR="${PROJECT_DIR}/backend"
|
||||||
|
FRONTEND_DIR="${PROJECT_DIR}/frontend"
|
||||||
|
BACKEND_OUTPUT_DIR="${PROJECT_DIR}/deploy/backend"
|
||||||
|
FRONTEND_OUTPUT_DIR="${PROJECT_DIR}/deploy/frontend"
|
||||||
|
|
||||||
|
# Maven 配置
|
||||||
|
MAVEN_PROFILE="prod"
|
||||||
|
JAVA_VERSION="17"
|
||||||
|
|
||||||
|
# 颜色输出
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
echo -e "${GREEN}XL监狱综合管理平台 - 前后端编译脚本${NC}"
|
||||||
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查依赖
|
||||||
|
echo -e "${BLUE}📋 检查编译环境...${NC}"
|
||||||
|
|
||||||
|
# 检查 Maven
|
||||||
|
if ! command -v mvn &> /dev/null; then
|
||||||
|
echo -e "${RED}❌ 错误: 未找到 Maven,请先安装 Maven${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✅ Maven 版本: $(mvn -version | head -1)${NC}"
|
||||||
|
|
||||||
|
# 检查 Node.js
|
||||||
|
if ! command -v node &> /dev/null; then
|
||||||
|
echo -e "${RED}❌ 错误: 未找到 Node.js,请先安装 Node.js${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✅ Node.js 版本: $(node -v)${NC}"
|
||||||
|
|
||||||
|
# 检查 pnpm
|
||||||
|
if ! command -v pnpm &> /dev/null; then
|
||||||
|
echo -e "${YELLOW}⚠️ 未找到 pnpm,尝试使用 npm...${NC}"
|
||||||
|
PACKAGE_MANAGER="npm"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}✅ pnpm 版本: $(pnpm -v)${NC}"
|
||||||
|
PACKAGE_MANAGER="pnpm"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}开始编译...${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 第一部分:编译后端
|
||||||
|
# ============================================
|
||||||
|
echo -e "${BLUE}🏗️ 编译后端项目...${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
cd "${BACKEND_DIR}"
|
||||||
|
|
||||||
|
# 清理并编译
|
||||||
|
echo -e "${YELLOW}📦 清理并编译后端...${NC}"
|
||||||
|
mvn clean package -DskipTests -Dmaven.javadoc.skip=true -q
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✅ 后端编译成功!${NC}"
|
||||||
|
|
||||||
|
# 查找生成的 JAR 文件
|
||||||
|
JAR_FILE=$(find "${BACKEND_DIR}/yudao-server/target" -name "yudao-server-*.jar" 2>/dev/null | head -1)
|
||||||
|
if [ -n "$JAR_FILE" ]; then
|
||||||
|
echo -e "${GREEN}📁 生成的 JAR 文件: ${JAR_FILE}${NC}"
|
||||||
|
|
||||||
|
# 复制到部署目录
|
||||||
|
mkdir -p "${BACKEND_OUTPUT_DIR}"
|
||||||
|
cp "${JAR_FILE}" "${BACKEND_OUTPUT_DIR}/"
|
||||||
|
echo -e "${GREEN}📁 已复制到部署目录: ${BACKEND_OUTPUT_DIR}/$(basename $JAR_FILE)${NC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ 后端编译失败!${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 第二部分:编译前端
|
||||||
|
# ============================================
|
||||||
|
echo -e "${BLUE}🎨 编译前端项目...${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
cd "${FRONTEND_DIR}"
|
||||||
|
|
||||||
|
# 检查依赖是否已安装
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
echo -e "${YELLOW}📥 安装前端依赖...${NC}"
|
||||||
|
$PACKAGE_MANAGER install
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "${RED}❌ 前端依赖安装失败!${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 清理并编译生产版本
|
||||||
|
echo -e "${YELLOW}📦 编译前端生产版本...${NC}"
|
||||||
|
$PACKAGE_MANAGER build:prod
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✅ 前端编译成功!${NC}"
|
||||||
|
|
||||||
|
# 复制到部署目录
|
||||||
|
mkdir -p "${FRONTEND_OUTPUT_DIR}"
|
||||||
|
|
||||||
|
# 复制编译产物
|
||||||
|
if [ -d "dist" ]; then
|
||||||
|
rm -rf "${FRONTEND_OUTPUT_DIR}/dist"
|
||||||
|
cp -r "dist" "${FRONTEND_OUTPUT_DIR}/"
|
||||||
|
echo -e "${GREEN}📁 已复制到部署目录: ${FRONTEND_OUTPUT_DIR}/dist${NC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ 前端编译失败!${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 完成
|
||||||
|
# ============================================
|
||||||
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
echo -e "${GREEN}🎉 编译完成!${NC}"
|
||||||
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}部署文件位置:${NC}"
|
||||||
|
echo -e " - 后端: ${BACKEND_OUTPUT_DIR}/"
|
||||||
|
echo -e " - 前端: ${FRONTEND_OUTPUT_DIR}/dist/"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}下一步:${NC}"
|
||||||
|
echo -e " 1. 部署后端 JAR 文件"
|
||||||
|
echo -e " 2. 部署前端静态文件"
|
||||||
|
echo -e " 3. 配置 Nginx"
|
||||||
|
echo ""
|
||||||
27
deploy/.gitignore
vendored
Normal file
27
deploy/.gitignore
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# 数据目录
|
||||||
|
data/
|
||||||
|
|
||||||
|
# 日志文件
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# Docker 镜像(体积大,不纳入版本控制)
|
||||||
|
xlcp-images/
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
*.tmp
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# 环境变量
|
||||||
|
.env.local
|
||||||
|
.env.*.local
|
||||||
297
deploy/DEPLOYMENT_CHECKLIST.md
Normal file
297
deploy/DEPLOYMENT_CHECKLIST.md
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
# XL监狱综合管理平台 - 部署前检查清单
|
||||||
|
|
||||||
|
## 🖥️ 远程服务器架构检查
|
||||||
|
|
||||||
|
由于无法直接SSH连接,请手动运行以下命令检查远程服务器架构:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.10.150 "uname -m && cat /etc/os-release && docker --version && docker compose version"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 预期输出示例:
|
||||||
|
|
||||||
|
**x86_64 架构 (最常见)**:
|
||||||
|
```
|
||||||
|
x86_64
|
||||||
|
NAME="CentOS Linux"
|
||||||
|
VERSION="7 (Core)"
|
||||||
|
Docker version 24.0.7
|
||||||
|
Docker Compose version v2.24.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**ARM64 架构 (树莓派、ARM服务器)**:
|
||||||
|
```
|
||||||
|
aarch64
|
||||||
|
NAME="Ubuntu"
|
||||||
|
VERSION="22.04.3 LTS (Jammy Jellyfish)"
|
||||||
|
Docker version 24.0.7
|
||||||
|
Docker Compose version v2.24.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## ✅ 部署方式选择
|
||||||
|
|
||||||
|
### 方式 A: 在线部署 (服务器网络良好)
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- 服务器可以访问 Docker Hub
|
||||||
|
- 网络带宽充足
|
||||||
|
- 快速测试部署
|
||||||
|
|
||||||
|
**步骤**:
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
./scripts/deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式 B: 离线部署 (推荐生产环境) ⭐
|
||||||
|
|
||||||
|
**适用场景**:
|
||||||
|
- 服务器网络受限
|
||||||
|
- 需要离线部署
|
||||||
|
- 多服务器部署
|
||||||
|
- 网络速度慢
|
||||||
|
|
||||||
|
**步骤**:
|
||||||
|
|
||||||
|
#### 1. 本地打包镜像
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
./scripts/save-images.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
这会创建 `images-archive/` 目录,包含:
|
||||||
|
- `xlcp-docker-images.tar.gz` (约 2-3GB)
|
||||||
|
- `upload.sh` (自动上传脚本)
|
||||||
|
- `README.md` (详细说明)
|
||||||
|
|
||||||
|
#### 2. 上传镜像到服务器
|
||||||
|
|
||||||
|
**方式 2.1: 使用自动脚本** (最简单)
|
||||||
|
```bash
|
||||||
|
cd images-archive
|
||||||
|
./upload.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**方式 2.2: 手动上传**
|
||||||
|
```bash
|
||||||
|
cd images-archive
|
||||||
|
|
||||||
|
# 使用 scp
|
||||||
|
scp xlcp-docker-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||||
|
|
||||||
|
# 或使用 rsync
|
||||||
|
rsync -avz --progress xlcp-docker-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. 在服务器加载镜像
|
||||||
|
```bash
|
||||||
|
# SSH 到服务器
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
|
||||||
|
# 进入目录
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
|
||||||
|
# 加载镜像
|
||||||
|
docker load -i xlcp-docker-images.tar.gz
|
||||||
|
|
||||||
|
# 验证镜像
|
||||||
|
docker images | grep -E 'mysql|redis|nginx'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. 部署服务
|
||||||
|
```bash
|
||||||
|
# 确保部署文件已上传
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# 查看状态
|
||||||
|
docker compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 镜像兼容性说明
|
||||||
|
|
||||||
|
### ✅ 全平台支持
|
||||||
|
|
||||||
|
以下镜像在 **x86_64** 和 **ARM64** 上都支持:
|
||||||
|
|
||||||
|
| 镜像 | x86_64 | ARM64 | 说明 |
|
||||||
|
|------|--------|-------|------|
|
||||||
|
| mysql:8.0 | ✅ | ✅ | 官方支持双架构 |
|
||||||
|
| redis:7-alpine | ✅ | ✅ | 官方支持双架构 |
|
||||||
|
| nginx:1.25-alpine | ✅ | ✅ | 官方支持双架构 |
|
||||||
|
| node:20-alpine | ✅ | ✅ | 官方支持双架构 |
|
||||||
|
|
||||||
|
### ⚠️ 构建镜像
|
||||||
|
|
||||||
|
以下镜像仅在本地构建时使用,不会影响部署:
|
||||||
|
|
||||||
|
| 镜像 | 用途 | x86_64 | ARM64 |
|
||||||
|
|------|------|--------|-------|
|
||||||
|
| maven:3.9-eclipse-temurin-21 | 后端编译 | ✅ | ✅ |
|
||||||
|
| eclipse-temurin:21-jre-alpine | 后端运行 | ✅ | ✅ |
|
||||||
|
|
||||||
|
### 🔄 架构不兼容怎么办?
|
||||||
|
|
||||||
|
如果远程服务器架构与本地不同,有以下解决方案:
|
||||||
|
|
||||||
|
#### 方案 1: 在远程服务器直接构建 (推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 上传源代码到服务器
|
||||||
|
rsync -avz --exclude node_modules --exclude target \
|
||||||
|
../ root@192.168.10.150:/projects/data/xlcp/
|
||||||
|
|
||||||
|
# SSH 到服务器
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
|
||||||
|
# 进入项目目录
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
|
||||||
|
# 构建镜像
|
||||||
|
cd deploy
|
||||||
|
docker compose build
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方案 2: 使用 buildx 构建多架构镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启用 buildx
|
||||||
|
docker buildx create --name multiarch --use
|
||||||
|
|
||||||
|
# 构建并导出多架构镜像
|
||||||
|
docker buildx build --platform linux/amd64,linux/arm64 \
|
||||||
|
-t xlcp-backend \
|
||||||
|
--load \
|
||||||
|
-f docker/backend/Dockerfile \
|
||||||
|
../backend
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方案 3: 使用交叉编译 (高级)
|
||||||
|
|
||||||
|
需要配置 QEMU 等工具,比较复杂,不推荐。
|
||||||
|
|
||||||
|
## 🎯 快速决策树
|
||||||
|
|
||||||
|
```
|
||||||
|
检查服务器网络
|
||||||
|
|
|
||||||
|
├─ 可以访问 Docker Hub
|
||||||
|
| └─ 使用方式 A (在线部署)
|
||||||
|
|
|
||||||
|
└─ 无法访问或速度慢
|
||||||
|
|
|
||||||
|
├─ 架构相同 (都是 x86_64 或都是 ARM64)
|
||||||
|
| └─ 使用方式 B (离线部署)
|
||||||
|
|
|
||||||
|
└─ 架构不同
|
||||||
|
|
|
||||||
|
├─ 服务器性能好
|
||||||
|
| └─ 方案 1 (远程构建)
|
||||||
|
|
|
||||||
|
└─ 服务器性能差
|
||||||
|
└─ 找一台相同架构的机器做离线包
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 实际操作示例
|
||||||
|
|
||||||
|
### 示例 1: 本地 Mac (ARM64) -> 远程 Linux (x86_64)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查本地架构
|
||||||
|
uname -m
|
||||||
|
# 输出: arm64 (Apple Silicon)
|
||||||
|
|
||||||
|
# 检查远程架构
|
||||||
|
ssh root@192.168.10.150 "uname -m"
|
||||||
|
# 输出: x86_64
|
||||||
|
|
||||||
|
# 由于架构不同,选择在远程服务器构建
|
||||||
|
rsync -avz --exclude node_modules --exclude target \
|
||||||
|
/path/to/xlcp/ root@192.168.10.150:/projects/data/xlcp/
|
||||||
|
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose up -d --build'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 示例 2: 本地 Mac (x86_64) -> 远程 Linux (x86_64)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 架构相同,可以使用离线部署
|
||||||
|
cd /path/to/xlcp/deploy
|
||||||
|
./scripts/save-images.sh
|
||||||
|
|
||||||
|
cd images-archive
|
||||||
|
./upload.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🆘 常见问题
|
||||||
|
|
||||||
|
### Q1: 如何快速查看服务器架构?
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.10.150 "uname -m"
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
- `x86_64` = Intel/AMD 64位
|
||||||
|
- `aarch64` = ARM 64位
|
||||||
|
- `armv7l` = ARM 32位
|
||||||
|
|
||||||
|
### Q2: 镜像很大,上传需要多久?
|
||||||
|
|
||||||
|
取决于网络速度:
|
||||||
|
- 100Mbps: 约 3-5 分钟
|
||||||
|
- 10Mbps: 约 30-50 分钟
|
||||||
|
- 1Mbps: 约 5-8 小时
|
||||||
|
|
||||||
|
建议使用 rsync,支持断点续传。
|
||||||
|
|
||||||
|
### Q3: 上传中断了怎么办?
|
||||||
|
|
||||||
|
使用 rsync 的断点续传功能:
|
||||||
|
```bash
|
||||||
|
rsync -avz --partial --progress \
|
||||||
|
xlcp-docker-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q4: 服务器没有 Docker 怎么办?
|
||||||
|
|
||||||
|
先安装 Docker:
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
|
||||||
|
# CentOS/RHEL
|
||||||
|
curl -fsSL https://get.docker.com | sh
|
||||||
|
systemctl start docker
|
||||||
|
systemctl enable docker
|
||||||
|
|
||||||
|
# Ubuntu/Debian
|
||||||
|
curl -fsSL https://get.docker.com | sh
|
||||||
|
systemctl start docker
|
||||||
|
systemctl enable docker
|
||||||
|
```
|
||||||
|
|
||||||
|
## ✅ 推荐的最佳实践
|
||||||
|
|
||||||
|
1. **开发环境**: 使用在线部署,快速迭代
|
||||||
|
2. **测试环境**: 使用离线部署,模拟生产
|
||||||
|
3. **生产环境**:
|
||||||
|
- 准备离线镜像包
|
||||||
|
- 多次测试部署流程
|
||||||
|
- 准备回滚方案
|
||||||
|
4. **多环境部署**: 建立镜像仓库 (Harbor/Registry)
|
||||||
|
|
||||||
|
## 📞 下一步
|
||||||
|
|
||||||
|
完成架构检查后,选择对应的部署方式:
|
||||||
|
|
||||||
|
- **在线部署**: 直接运行 `./scripts/deploy.sh`
|
||||||
|
- **离线部署**: 先运行 `./scripts/save-images.sh`
|
||||||
|
- **远程构建**: 先上传代码,再远程构建
|
||||||
|
|
||||||
|
需要帮助? 查看各脚本的帮助信息:
|
||||||
|
```bash
|
||||||
|
./scripts/save-images.sh --help
|
||||||
|
./scripts/deploy.sh --help
|
||||||
|
```
|
||||||
232
deploy/DEPLOYMENT_STATUS.md
Normal file
232
deploy/DEPLOYMENT_STATUS.md
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
# XL监狱综合管理平台 - 部署完成报告
|
||||||
|
|
||||||
|
## 📊 部署状态
|
||||||
|
|
||||||
|
### ✅ 已完成 (方案 A - 离线部署)
|
||||||
|
|
||||||
|
#### 步骤 1: 本地镜像打包 ✅
|
||||||
|
- 下载并打包了 6 个 Docker 镜像
|
||||||
|
- 文件: `xlcp-docker-images.tar.gz` (592MB)
|
||||||
|
- 完成时间: 约 15 分钟
|
||||||
|
|
||||||
|
#### 步骤 2: 上传镜像到服务器 ✅
|
||||||
|
- 目标服务器: `root@192.168.10.150`
|
||||||
|
- 部署目录: `/projects/data/xlcp`
|
||||||
|
- 上传时间: 约 1 分钟 (内网速度 ~10MB/s)
|
||||||
|
- 所有镜像已成功加载
|
||||||
|
|
||||||
|
#### 步骤 3: 启动基础服务 ✅
|
||||||
|
**运行中的服务:**
|
||||||
|
- ✅ MySQL 8.0 - 端口 3306 - 健康检查通过
|
||||||
|
- ✅ Redis 7 - 端口 6380 - 健康检查通过 (已自动调整端口避免冲突)
|
||||||
|
|
||||||
|
**服务器信息:**
|
||||||
|
- 架构: ARM64 (aarch64)
|
||||||
|
- 系统: openEuler 22.03 (LTS-SP4)
|
||||||
|
- Docker: v28.5.2
|
||||||
|
- Docker Compose: v2.40.3 (同时支持 docker-compose v1)
|
||||||
|
- 内存: 250GB 总计
|
||||||
|
- 磁盘: 62GB 可用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 待完成
|
||||||
|
|
||||||
|
### 步骤 4: 构建并启动应用服务
|
||||||
|
|
||||||
|
由于应用需要在服务器上编译构建,还需要以下步骤:
|
||||||
|
|
||||||
|
#### 后端服务 (Spring Boot + Java 21)
|
||||||
|
**需要:**
|
||||||
|
1. 上传 backend 源代码
|
||||||
|
2. 在服务器上 Maven 编译
|
||||||
|
3. 构建 Docker 镜像
|
||||||
|
4. 启动容器
|
||||||
|
|
||||||
|
**预计时间:** 10-15 分钟
|
||||||
|
|
||||||
|
#### 前端服务 (Vue 3 + Node 20)
|
||||||
|
**需要:**
|
||||||
|
1. 上传 frontend 源代码
|
||||||
|
2. 在服务器上 pnpm 安装依赖
|
||||||
|
3. 构建 Vue 应用
|
||||||
|
4. 构建 Docker 镜像
|
||||||
|
5. 启动 Nginx 容器
|
||||||
|
|
||||||
|
**预计时间:** 5-10 分钟
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 完成部署的两种方式
|
||||||
|
|
||||||
|
### 方式 1: 使用远程构建脚本 (推荐) ⭐
|
||||||
|
|
||||||
|
**最简单,一键完成所有操作**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Volumes/Dpan/github/xlcp/deploy
|
||||||
|
./scripts/remote-build.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**这个脚本会自动:**
|
||||||
|
1. 上传 backend 和 frontend 源代码
|
||||||
|
2. 在远程服务器编译构建
|
||||||
|
3. 启动所有服务
|
||||||
|
4. 健康检查
|
||||||
|
|
||||||
|
**注意:** 需要先修改脚本中的服务器地址为 `root@192.168.10.150`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 方式 2: 手动分步执行
|
||||||
|
|
||||||
|
#### 2.1 上传源代码
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 上传 backend
|
||||||
|
rsync -avz --exclude node_modules --exclude target \
|
||||||
|
../backend/ root@192.168.10.150:/projects/data/xlcp/backend/
|
||||||
|
|
||||||
|
# 上传 frontend
|
||||||
|
rsync -avz --exclude node_modules --exclude 'dist*' \
|
||||||
|
../frontend/ root@192.168.10.150:/projects/data/xlcp/frontend/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2 构建并启动服务
|
||||||
|
|
||||||
|
SSH 到服务器:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
|
||||||
|
# 构建后端镜像
|
||||||
|
docker-compose build backend
|
||||||
|
|
||||||
|
# 构建前端镜像
|
||||||
|
docker-compose build frontend
|
||||||
|
|
||||||
|
# 启动所有服务
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 查看状态
|
||||||
|
docker-compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 验证部署
|
||||||
|
|
||||||
|
部署完成后,访问以下地址验证:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 前端页面
|
||||||
|
curl http://192.168.10.150/
|
||||||
|
|
||||||
|
# 后端健康检查
|
||||||
|
curl http://192.168.10.150:48080/actuator/health
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp && docker-compose logs -f'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 管理命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH 到服务器
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
|
||||||
|
# 进入项目目录
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
|
||||||
|
# 查看服务状态
|
||||||
|
docker-compose ps
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# 重启服务
|
||||||
|
docker-compose restart backend frontend
|
||||||
|
|
||||||
|
# 停止所有服务
|
||||||
|
docker-compose stop
|
||||||
|
|
||||||
|
# 启动所有服务
|
||||||
|
docker-compose start
|
||||||
|
|
||||||
|
# 删除所有容器
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 访问地址 (部署完成后)
|
||||||
|
|
||||||
|
- **前端页面**: http://192.168.10.150/
|
||||||
|
- **后端 API**: http://192.168.10.150:48080/admin-api/
|
||||||
|
- **健康检查**: http://192.168.10.150:48080/actuator/health
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
|
1. **Redis 端口已调整**
|
||||||
|
- 原端口: 6379
|
||||||
|
- 新端口: 6380 (避免与现有服务冲突)
|
||||||
|
- 已自动更新 `.env` 配置
|
||||||
|
|
||||||
|
2. **首次部署需要构建**
|
||||||
|
- 后端 Java 编译需要 10-15 分钟
|
||||||
|
- 前端 Vue 构建需要 5-10 分钟
|
||||||
|
- 请耐心等待
|
||||||
|
|
||||||
|
3. **磁盘空间**
|
||||||
|
- 镜像文件: 约 2GB
|
||||||
|
- 构建缓存: 约 1GB
|
||||||
|
- 日志和数据: 随时间增长
|
||||||
|
|
||||||
|
4. **防火墙**
|
||||||
|
- 确保端口 80, 48080, 3306, 6380 已开放
|
||||||
|
- 或在内网访问
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 下一步
|
||||||
|
|
||||||
|
**请选择:**
|
||||||
|
|
||||||
|
A. **一键完成部署** (推荐)
|
||||||
|
- 运行: `./scripts/remote-build.sh`
|
||||||
|
- 等待 10-30 分钟自动完成
|
||||||
|
|
||||||
|
B. **手动分步部署**
|
||||||
|
- 按照上述步骤手动执行
|
||||||
|
- 更可控,可以看到详细过程
|
||||||
|
|
||||||
|
C. **暂时停止**
|
||||||
|
- MySQL 和 Redis 已运行
|
||||||
|
- 可以稍后继续部署应用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 部署时间线
|
||||||
|
|
||||||
|
| 步骤 | 操作 | 耗时 | 状态 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| 1 | 本地打包镜像 | 15 分钟 | ✅ 完成 |
|
||||||
|
| 2 | 上传镜像到服务器 | 1 分钟 | ✅ 完成 |
|
||||||
|
| 3 | 启动 MySQL/Redis | 1 分钟 | ✅ 完成 |
|
||||||
|
| 4 | 构建后端服务 | 10-15 分钟 | ⏳ 待完成 |
|
||||||
|
| 5 | 构建前端服务 | 5-10 分钟 | ⏳ 待完成 |
|
||||||
|
| **总计** | | **32-42 分钟** | **60% 完成** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**当前进度: 60%**
|
||||||
|
|
||||||
|
✅ 基础设施已就绪
|
||||||
|
⏳ 应用服务待部署
|
||||||
|
|
||||||
|
*建议使用远程构建脚本一键完成剩余 40% 的工作*
|
||||||
393
deploy/DEPLOY_JAR.md
Normal file
393
deploy/DEPLOY_JAR.md
Normal file
@ -0,0 +1,393 @@
|
|||||||
|
# XL监狱综合管理平台 - 生产部署包部署指南
|
||||||
|
|
||||||
|
## 📋 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
deploy/
|
||||||
|
├── docker-compose.yml # Docker Compose 编排文件
|
||||||
|
├── config/
|
||||||
|
│ └── application-prod.yaml # 生产环境配置
|
||||||
|
├── docker/
|
||||||
|
│ └── backend/
|
||||||
|
│ ├── Dockerfile # 后端镜像构建(基于已编译的 JAR)
|
||||||
|
│ └── .dockerignore
|
||||||
|
├── sql/
|
||||||
|
│ └── prison_schema.sql # 数据库初始化脚本
|
||||||
|
└── scripts/
|
||||||
|
├── build.sh # 本地镜像构建脚本
|
||||||
|
├── deploy.sh # 远程部署脚本(含源码构建)
|
||||||
|
├── deploy-jar-only.sh # 新增:仅部署已编译 JAR 包
|
||||||
|
├── init-db.sh # 数据库初始化脚本
|
||||||
|
└── save-images.sh # 基础镜像打包脚本
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 两种部署模式对比
|
||||||
|
|
||||||
|
| 部署模式 | 使用场景 | 是否需要源码 | 是否需要编译 | 构建位置 |
|
||||||
|
|---------|---------|------------|------------|---------|
|
||||||
|
| **源码构建** | 开发环境、有构建权限的环境 | ✅ 需要 | ✅ 需要 | Docker 容器内 |
|
||||||
|
| **JAR 包部署** | 生产环境、无构建权限的环境 | ❌ 不需要 | ❌ 不需要 | 本地已完成编译 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 方式一:JAR 包部署(推荐生产环境)
|
||||||
|
|
||||||
|
### 适用场景
|
||||||
|
|
||||||
|
- 生产服务器没有 Maven/Node.js 环境
|
||||||
|
- 希望快速部署,不想在服务器上编译
|
||||||
|
- 源码不对外开放,只交付编译产物
|
||||||
|
|
||||||
|
### 前置要求
|
||||||
|
|
||||||
|
1. **本地已完成编译**:
|
||||||
|
```bash
|
||||||
|
# 后端编译
|
||||||
|
cd backend
|
||||||
|
mvn clean package -DskipTests
|
||||||
|
|
||||||
|
# 前端编译(如果使用 Docker 构建 Nginx 镜像)
|
||||||
|
cd frontend
|
||||||
|
pnpm install
|
||||||
|
pnpm build:prod
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **服务器环境**:
|
||||||
|
- Docker 20.10+
|
||||||
|
- Docker Compose 2.0+
|
||||||
|
- 至少 4GB 内存, 20GB 磁盘空间
|
||||||
|
|
||||||
|
### 部署步骤
|
||||||
|
|
||||||
|
#### 1. 本地构建 JAR 包镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/xlcp/deploy
|
||||||
|
|
||||||
|
# 使用专门的 JAR 包部署脚本
|
||||||
|
./scripts/deploy-jar-only.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
这个脚本会:
|
||||||
|
- ✅ 检查后端 JAR 包是否存在(`backend/yudao-server/target/yudao-server.jar`)
|
||||||
|
- ✅ 检查前端构建产物是否存在(`frontend/dist/`)
|
||||||
|
- ✅ 使用 `docker/backend/Dockerfile.jar` 构建 Docker 镜像
|
||||||
|
- ✅ 上传镜像到远程服务器
|
||||||
|
- ✅ 上传必要的配置文件和 docker-compose.yml
|
||||||
|
- ✅ 在远程服务器启动服务
|
||||||
|
|
||||||
|
#### 2. 手动部署流程(如果不用脚本)
|
||||||
|
|
||||||
|
**2.1 本地构建镜像**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
|
||||||
|
# 构建后端镜像(基于已编译的 JAR)
|
||||||
|
docker build -f docker/backend/Dockerfile.jar -t xlcp-backend:latest ../backend
|
||||||
|
|
||||||
|
# 构建前端镜像(基于已编译的 dist)
|
||||||
|
docker build -f docker/frontend/Dockerfile.dist -t xlcp-frontend:latest ../frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
**2.2 导出镜像**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 导出镜像为 tar 文件
|
||||||
|
docker save xlcp-backend xlcp-frontend | gzip > xlcp-images.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
**2.3 上传到服务器**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 上传镜像文件
|
||||||
|
scp xlcp-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||||
|
|
||||||
|
# 上传配置文件
|
||||||
|
rsync -avz \
|
||||||
|
--exclude 'node_modules' \
|
||||||
|
--exclude 'target' \
|
||||||
|
--exclude '.git' \
|
||||||
|
--exclude 'backend' \
|
||||||
|
--exclude 'frontend' \
|
||||||
|
./ root@192.168.10.150:/projects/data/xlcp/deploy/
|
||||||
|
```
|
||||||
|
|
||||||
|
**2.4 服务器端加载镜像**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH 到服务器
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
|
||||||
|
# 进入目录
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
|
||||||
|
# 加载镜像
|
||||||
|
docker load -i xlcp-images.tar.gz
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
cd deploy
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. 验证部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 健康检查
|
||||||
|
curl http://192.168.10.150:48080/actuator/health
|
||||||
|
curl http://192.168.10.150/
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose logs -f'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔨 方式二:源码构建部署(开发环境)
|
||||||
|
|
||||||
|
### 适用场景
|
||||||
|
|
||||||
|
- 开发环境
|
||||||
|
- 服务器有完整的构建环境(Maven, Node.js)
|
||||||
|
- 需要在服务器上实时修改代码并重新构建
|
||||||
|
|
||||||
|
### 部署步骤
|
||||||
|
|
||||||
|
#### 使用现有的 deploy.sh 脚本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
|
||||||
|
# 默认部署到 root@192.168.10.150
|
||||||
|
./scripts/deploy.sh
|
||||||
|
|
||||||
|
# 或指定服务器
|
||||||
|
REMOTE_SERVER=root@192.168.10.150 ./scripts/deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
脚本会:
|
||||||
|
1. 上传源代码到服务器
|
||||||
|
2. 在服务器上使用 Docker 构建镜像
|
||||||
|
3. 启动所有服务
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📂 文件说明
|
||||||
|
|
||||||
|
### 核心配置文件
|
||||||
|
|
||||||
|
- **docker-compose.yml**:服务编排文件,定义 MySQL、Redis、Backend、Frontend 服务
|
||||||
|
- **config/application-prod.yaml**:生产环境配置(数据库连接、Redis 配置等)
|
||||||
|
|
||||||
|
### Docker 镜像构建文件
|
||||||
|
|
||||||
|
- **docker/backend/Dockerfile**:多阶段构建,从源码编译(Maven + Java 源码 → JAR → 镜像)
|
||||||
|
- **docker/backend/Dockerfile.jar**:直接使用已编译的 JAR 包(JAR → 镜像)- **新增**
|
||||||
|
- **docker/frontend/Dockerfile**:前端构建(Node.js + Vue 源码 → dist → Nginx 镜像)
|
||||||
|
- **docker/frontend/Dockerfile.dist**:直接使用已编译的 dist(dist → Nginx 镜像)- **新增**
|
||||||
|
|
||||||
|
### 部署脚本
|
||||||
|
|
||||||
|
- **scripts/deploy.sh**:源码构建部署(上传源码 → 服务器构建)
|
||||||
|
- **scripts/deploy-jar-only.sh**:JAR 包部署(本地构建镜像 → 上传镜像)- **新增**
|
||||||
|
- **scripts/save-images.sh**:打包基础镜像(MySQL, Redis, Nginx, Java)
|
||||||
|
- **scripts/upload-to-150.sh**:上传镜像到 192.168.10.150
|
||||||
|
- **scripts/init-db.sh**:初始化数据库
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 部署流程详解
|
||||||
|
|
||||||
|
### JAR 包部署流程(推荐)
|
||||||
|
|
||||||
|
```
|
||||||
|
[本地] 编译 JAR 包
|
||||||
|
↓
|
||||||
|
[本地] 构建 Docker 镜像(基于 JAR)
|
||||||
|
↓
|
||||||
|
[本地] 导出镜像为 tar 文件
|
||||||
|
↓
|
||||||
|
[上传] 镜像文件 + 配置文件 → 服务器
|
||||||
|
↓
|
||||||
|
[服务器] 加载镜像
|
||||||
|
↓
|
||||||
|
[服务器] docker compose up -d
|
||||||
|
↓
|
||||||
|
[完成] 服务运行
|
||||||
|
```
|
||||||
|
|
||||||
|
### 源码构建部署流程
|
||||||
|
|
||||||
|
```
|
||||||
|
[上传] 源代码 + 配置文件 → 服务器
|
||||||
|
↓
|
||||||
|
[服务器] docker compose build(在容器内编译)
|
||||||
|
↓
|
||||||
|
[服务器] docker compose up -d
|
||||||
|
↓
|
||||||
|
[完成] 服务运行
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 快速命令参考
|
||||||
|
|
||||||
|
### JAR 包部署(推荐生产)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 本地编译
|
||||||
|
cd backend && mvn clean package -DskipTests
|
||||||
|
cd ../frontend && pnpm build:prod
|
||||||
|
|
||||||
|
# 2. 本地构建镜像
|
||||||
|
cd ../deploy
|
||||||
|
./scripts/deploy-jar-only.sh root@192.168.10.150
|
||||||
|
```
|
||||||
|
|
||||||
|
### 源码构建部署(开发环境)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 直接部署(服务器上构建)
|
||||||
|
cd deploy
|
||||||
|
./scripts/deploy.sh root@192.168.10.150
|
||||||
|
```
|
||||||
|
|
||||||
|
### 服务管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看状态
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose ps'
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose logs -f backend'
|
||||||
|
|
||||||
|
# 重启服务
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose restart backend'
|
||||||
|
|
||||||
|
# 停止服务
|
||||||
|
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose down'
|
||||||
|
|
||||||
|
# 更新服务(重新构建镜像)
|
||||||
|
docker compose build backend && docker compose up -d backend
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
|
### 生产环境建议
|
||||||
|
|
||||||
|
1. **使用 JAR 包部署**,不要在服务器上编译
|
||||||
|
2. **修改默认密码**(MySQL root、Redis)
|
||||||
|
3. **配置防火墙**,仅开放必要端口(80, 443)
|
||||||
|
4. **启用 HTTPS**,配置 SSL 证书
|
||||||
|
5. **定期备份数据**(数据库、上传文件)
|
||||||
|
6. **监控日志**,及时发现异常
|
||||||
|
|
||||||
|
### 磁盘空间管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看磁盘使用
|
||||||
|
docker system df
|
||||||
|
|
||||||
|
# 清理未使用的镜像
|
||||||
|
docker image prune -a
|
||||||
|
|
||||||
|
# 清理未使用的容器
|
||||||
|
docker container prune
|
||||||
|
|
||||||
|
# 清理未使用的卷
|
||||||
|
docker volume prune
|
||||||
|
|
||||||
|
# 全面清理(谨慎使用)
|
||||||
|
docker system prune -a --volumes
|
||||||
|
```
|
||||||
|
|
||||||
|
### 网络配置
|
||||||
|
|
||||||
|
如果服务器有防火墙,确保开放以下端口:
|
||||||
|
|
||||||
|
- **80**:HTTP 访问(前端)
|
||||||
|
- **443**:HTTPS 访问(前端,如果启用 SSL)
|
||||||
|
- **48080**:后端 API(可配置防火墙规则仅允许内网访问)
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 附录
|
||||||
|
|
||||||
|
### 环境变量说明
|
||||||
|
|
||||||
|
| 变量名 | 默认值 | 说明 |
|
||||||
|
|---------|---------|------|
|
||||||
|
| MYSQL_ROOT_PASSWORD | Prison2024!@ | MySQL root 密码 |
|
||||||
|
| MYSQL_DATABASE | prison | 数据库名称 |
|
||||||
|
| MYSQL_PORT | 3306 | MySQL 端口 |
|
||||||
|
| REDIS_PASSWORD | Prison2024!@ | Redis 密码 |
|
||||||
|
| REDIS_PORT | 6379 | Redis 端口 |
|
||||||
|
| BACKEND_PORT | 48080 | 后端服务端口 |
|
||||||
|
| FRONTEND_PORT | 80 | 前端服务端口 |
|
||||||
|
| SPRING_PROFILES_ACTIVE | prod | Spring 环境配置 |
|
||||||
|
| JAVA_OPTS | -Xms512m -Xmx1024m | JVM 参数 |
|
||||||
|
|
||||||
|
### 访问地址
|
||||||
|
|
||||||
|
部署完成后:
|
||||||
|
- **前端**:http://192.168.10.150/
|
||||||
|
- **后端 API**:http://192.168.10.150:48080/admin-api/
|
||||||
|
- **健康检查**:http://192.168.10.150:48080/actuator/health
|
||||||
|
|
||||||
|
### 故障排查
|
||||||
|
|
||||||
|
#### 1. 后端服务无法启动
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看日志
|
||||||
|
docker compose logs backend
|
||||||
|
|
||||||
|
# 检查数据库连接
|
||||||
|
docker compose exec backend sh
|
||||||
|
curl http://mysql:3306
|
||||||
|
|
||||||
|
# 检查配置
|
||||||
|
docker compose exec backend cat /app/config/application-prod.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 前端页面无法访问
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 Nginx 配置
|
||||||
|
docker compose exec frontend nginx -t
|
||||||
|
|
||||||
|
# 查看 Nginx 日志
|
||||||
|
docker compose logs frontend
|
||||||
|
|
||||||
|
# 检查静态文件
|
||||||
|
docker compose exec frontend ls -la /usr/share/nginx/html
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. 数据库连接失败
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 MySQL 容器
|
||||||
|
docker compose ps mysql
|
||||||
|
docker compose logs mysql
|
||||||
|
|
||||||
|
# 测试连接
|
||||||
|
docker compose exec mysql mysql -u root -pPrison2024!@ -e "SELECT 1"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🆘 获取帮助
|
||||||
|
|
||||||
|
- 查看部署脚本帮助:`./scripts/deploy-jar-only.sh --help`
|
||||||
|
- 查看项目文档:`/README.md`
|
||||||
|
- 查看后端配置:`/backend/README.md`
|
||||||
|
- 查看前端配置:`/frontend/README.md`
|
||||||
439
deploy/README.md
Normal file
439
deploy/README.md
Normal file
@ -0,0 +1,439 @@
|
|||||||
|
# XL监狱综合管理平台 - Docker 部署指南
|
||||||
|
|
||||||
|
## 📋 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
deploy/
|
||||||
|
├── docker-compose.yml # Docker Compose 编排文件
|
||||||
|
├── .env # 环境变量配置
|
||||||
|
├── .gitignore # Git 忽略文件
|
||||||
|
├── config/
|
||||||
|
│ └── application-prod.yaml # 生产环境配置
|
||||||
|
├── data/ # 数据目录(自动创建)
|
||||||
|
│ ├── mysql/ # MySQL 数据文件
|
||||||
|
│ ├── redis/ # Redis 数据文件
|
||||||
|
│ └── upload/ # 上传文件
|
||||||
|
├── logs/ # 日志目录(自动创建)
|
||||||
|
│ ├── backend/ # 后端日志
|
||||||
|
│ └── nginx/ # Nginx 日志
|
||||||
|
├── docker/
|
||||||
|
│ └── frontend/
|
||||||
|
│ └── nginx.conf # Nginx 配置
|
||||||
|
├── sql/
|
||||||
|
│ └── prison_schema.sql # 数据库初始化脚本
|
||||||
|
└── scripts/
|
||||||
|
├── build.sh # 镜像构建脚本(已弃用)
|
||||||
|
├── deploy.sh # 远程部署脚本(已弃用)
|
||||||
|
├── init-db.sh # 数据库初始化脚本
|
||||||
|
└── init-permissions.sh # 权限初始化脚本
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
### 前置要求
|
||||||
|
|
||||||
|
- Docker 20.10+
|
||||||
|
- Docker Compose 2.0+ (或 docker-compose 1.29+)
|
||||||
|
- 服务器至少 4GB 内存, 20GB 磁盘空间
|
||||||
|
- SSH 免密登录到目标服务器 (如果远程部署)
|
||||||
|
|
||||||
|
### 方式一: 本地部署
|
||||||
|
|
||||||
|
#### 1. 克隆项目
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/xlcp
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 配置环境变量
|
||||||
|
|
||||||
|
编辑 `.env` 文件,根据需要修改配置:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
vi deploy/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
关键配置项:
|
||||||
|
- `MYSQL_ROOT_PASSWORD`: MySQL root 密码
|
||||||
|
- `REDIS_PASSWORD`: Redis 密码
|
||||||
|
- `BACKEND_PORT`: 后端服务端口 (默认 48080)
|
||||||
|
- `FRONTEND_PORT`: 前端服务端口 (默认 80)
|
||||||
|
|
||||||
|
#### 3. 构建镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
./scripts/build.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. 启动服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
或使用 docker-compose:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 5. 查看日志
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看所有服务日志
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# 查看特定服务日志
|
||||||
|
docker compose logs -f backend
|
||||||
|
docker compose logs -f frontend
|
||||||
|
docker compose logs -f mysql
|
||||||
|
docker compose logs -f redis
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 6. 停止服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 7. 完全清理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down -v # 同时删除数据卷
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式二: 远程部署 (推荐生产环境)
|
||||||
|
|
||||||
|
#### 1. 配置远程服务器信息
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 方式 1: 使用默认配置 (root@192.168.10.150)
|
||||||
|
cd deploy
|
||||||
|
./scripts/deploy.sh
|
||||||
|
|
||||||
|
# 方式 2: 自定义服务器
|
||||||
|
REMOTE_SERVER=user@your-server-ip ./scripts/deploy.sh
|
||||||
|
|
||||||
|
# 方式 3: 自定义部署目录
|
||||||
|
REMOTE_SERVER=root@192.168.10.150 REMOTE_DEPLOY_DIR=/projects/data/xlcp ./scripts/deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 部署流程
|
||||||
|
|
||||||
|
脚本会自动执行:
|
||||||
|
1. ✅ 检查 SSH 连接
|
||||||
|
2. ✅ 检查远程 Docker 环境
|
||||||
|
3. ✅ 创建远程目录结构
|
||||||
|
4. ✅ 上传部署文件
|
||||||
|
5. ✅ 启动所有容器
|
||||||
|
6. ✅ 健康检查
|
||||||
|
7. ✅ 显示访问信息
|
||||||
|
|
||||||
|
#### 3. 访问服务
|
||||||
|
|
||||||
|
部署完成后:
|
||||||
|
- 前端: http://192.168.10.150/
|
||||||
|
- 后端 API: http://192.168.10.150:48080/admin-api/
|
||||||
|
- 健康检查: http://192.168.10.150:48080/actuator/health
|
||||||
|
|
||||||
|
#### 4. 查看远程日志
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
cd /projects/data/xlcp
|
||||||
|
docker compose logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 服务管理
|
||||||
|
|
||||||
|
### 查看服务状态
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
### 重启单个服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 重启后端
|
||||||
|
docker compose restart backend
|
||||||
|
|
||||||
|
# 重启前端
|
||||||
|
docker compose restart frontend
|
||||||
|
|
||||||
|
# 重启 MySQL
|
||||||
|
docker compose restart mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 进入容器
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入后端容器
|
||||||
|
docker compose exec backend sh
|
||||||
|
|
||||||
|
# 进入 MySQL 容器
|
||||||
|
docker compose exec mysql bash
|
||||||
|
|
||||||
|
# 进入 Redis 容器
|
||||||
|
docker compose exec redis sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 更新服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 重新构建镜像
|
||||||
|
docker compose build backend frontend
|
||||||
|
|
||||||
|
# 2. 重启服务
|
||||||
|
docker compose up -d backend frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 数据库管理
|
||||||
|
|
||||||
|
### 初始化数据库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
./scripts/init-db.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 手动执行 SQL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入 MySQL 容器
|
||||||
|
docker compose exec mysql bash
|
||||||
|
|
||||||
|
# 连接 MySQL
|
||||||
|
mysql -u root -pPrison2024!@ prison
|
||||||
|
|
||||||
|
# 执行 SQL
|
||||||
|
source /docker-entrypoint-initdb.d/01-prison_schema.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 数据库备份
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 备份整个数据库
|
||||||
|
docker exec xlcp-mysql mysqldump -u root -pPrison2024!@ prison > prison_backup_$(date +%Y%m%d).sql
|
||||||
|
|
||||||
|
# 恢复数据库
|
||||||
|
docker exec -i xlcp-mysql mysql -u root -pPrison2024!@ prison < prison_backup_20250122.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看数据库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec xlcp-mysql mysql -u root -pPrison2024!@ prison -e "SHOW TABLES;"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 故障排查
|
||||||
|
|
||||||
|
### 服务无法启动
|
||||||
|
|
||||||
|
1. 查看服务日志
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs backend
|
||||||
|
docker compose logs frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 检查端口占用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
netstat -tlnp | grep -E '3306|6379|48080|80'
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 检查磁盘空间
|
||||||
|
|
||||||
|
```bash
|
||||||
|
df -h
|
||||||
|
docker system df
|
||||||
|
```
|
||||||
|
|
||||||
|
### 健康检查失败
|
||||||
|
|
||||||
|
1. 检查后端服务是否启动
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl http://localhost:48080/actuator/health
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 检查前端服务是否启动
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl http://localhost/
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 查看详细日志
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs -f backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 数据库连接失败
|
||||||
|
|
||||||
|
1. 检查 MySQL 容器状态
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose ps mysql
|
||||||
|
docker compose logs mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 测试数据库连接
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec xlcp-mysql mysqladmin ping -h localhost -u root -pPrison2024!@
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 检查配置文件
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat config/application-prod.yaml | grep datasource
|
||||||
|
```
|
||||||
|
|
||||||
|
### 前端页面无法访问
|
||||||
|
|
||||||
|
1. 检查 Nginx 配置
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec frontend nginx -t
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 查看 Nginx 日志
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 检查静态文件
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec frontend ls -la /usr/share/nginx/html
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 监控和日志
|
||||||
|
|
||||||
|
### 实时监控
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 监控所有服务
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# 监控特定服务
|
||||||
|
docker compose logs -f backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看日志文件
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 后端日志 (Docker 内部)
|
||||||
|
docker compose exec backend cat /logs/yudao-server.log
|
||||||
|
|
||||||
|
# Nginx 日志
|
||||||
|
docker compose exec frontend tail -f /var/log/nginx/access.log
|
||||||
|
docker compose exec frontend tail -f /var/log/nginx/error.log
|
||||||
|
|
||||||
|
# MySQL 日志
|
||||||
|
docker compose exec mysql tail -f /var/log/mysql/error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 资源监控
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看容器资源使用
|
||||||
|
docker stats
|
||||||
|
|
||||||
|
# 查看磁盘使用
|
||||||
|
docker system df
|
||||||
|
|
||||||
|
# 清理未使用的资源
|
||||||
|
docker system prune -a
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔒 安全建议
|
||||||
|
|
||||||
|
1. **修改默认密码**
|
||||||
|
- MySQL root 密码
|
||||||
|
- Redis 密码
|
||||||
|
|
||||||
|
2. **配置防火墙**
|
||||||
|
```bash
|
||||||
|
# 仅开放必要端口
|
||||||
|
firewall-cmd --permanent --add-port=48080/tcp
|
||||||
|
firewall-cmd --permanent --add-port=80/tcp
|
||||||
|
firewall-cmd --reload
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **启用 HTTPS**
|
||||||
|
- 准备 SSL 证书
|
||||||
|
- 放置到 `deploy/docker/ssl/` 目录
|
||||||
|
- 修改 `nginx.conf` 配置
|
||||||
|
|
||||||
|
4. **定期备份数据**
|
||||||
|
- 数据库备份
|
||||||
|
- 上传文件备份
|
||||||
|
- 配置文件备份
|
||||||
|
|
||||||
|
## 📚 附录
|
||||||
|
|
||||||
|
### 环境变量说明
|
||||||
|
|
||||||
|
| 变量名 | 默认值 | 说明 |
|
||||||
|
|---------|---------|------|
|
||||||
|
| MYSQL_ROOT_PASSWORD | Prison2024!@ | MySQL root 密码 |
|
||||||
|
| MYSQL_DATABASE | prison | 数据库名称 |
|
||||||
|
| MYSQL_PORT | 3306 | MySQL 端口 |
|
||||||
|
| REDIS_PASSWORD | Prison2024!@ | Redis 密码 |
|
||||||
|
| REDIS_PORT | 6379 | Redis 端口 |
|
||||||
|
| BACKEND_PORT | 48080 | 后端服务端口 |
|
||||||
|
| FRONTEND_PORT | 80 | 前端服务端口 |
|
||||||
|
| SPRING_PROFILES_ACTIVE | prod | Spring 环境配置 |
|
||||||
|
| JAVA_OPTS | -Xms512m -Xmx1024m | JVM 参数 |
|
||||||
|
|
||||||
|
### 端口说明
|
||||||
|
|
||||||
|
| 服务 | 容器端口 | 宿主机端口 | 说明 |
|
||||||
|
|------|-----------|------------|------|
|
||||||
|
| MySQL | 3306 | 3306 | 数据库服务 |
|
||||||
|
| Redis | 6379 | 6379 | 缓存服务 |
|
||||||
|
| Backend | 48080 | 48080 | 后端 API 服务 |
|
||||||
|
| Frontend | 80 | 80 | 前端 Web 服务 |
|
||||||
|
|
||||||
|
### 常用命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看 Docker 版本
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
|
|
||||||
|
# 查看容器列表
|
||||||
|
docker ps -a
|
||||||
|
|
||||||
|
# 查看镜像列表
|
||||||
|
docker images | grep xlcp
|
||||||
|
|
||||||
|
# 查看网络
|
||||||
|
docker network ls
|
||||||
|
docker network inspect xlcp_xlcp-network
|
||||||
|
|
||||||
|
# 查看数据卷
|
||||||
|
docker volume ls
|
||||||
|
docker volume inspect xlcp_mysql-data
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🆘 获取帮助
|
||||||
|
|
||||||
|
- 查看部署脚本帮助: `./scripts/deploy.sh --help`
|
||||||
|
- 查看项目文档: `/README.md`
|
||||||
|
- 查看后端配置: `/backend/README.md`
|
||||||
|
- 查看前端配置: `/frontend/README.md`
|
||||||
|
|
||||||
|
## 📞 技术支持
|
||||||
|
|
||||||
|
如遇问题,请提供以下信息:
|
||||||
|
1. Docker 版本: `docker --version`
|
||||||
|
2. Docker Compose 版本: `docker compose version`
|
||||||
|
3. 操作系统版本: `cat /etc/os-release`
|
||||||
|
4. 错误日志: `docker compose logs`
|
||||||
|
5. 问题描述和复现步骤
|
||||||
173
deploy/config/application-prod.yaml
Normal file
173
deploy/config/application-prod.yaml
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: xlcp-server
|
||||||
|
|
||||||
|
# 排除微信自动配置(不需要社交登录功能)
|
||||||
|
autoconfigure:
|
||||||
|
exclude:
|
||||||
|
- com.binarywang.spring.starter.wxjava.mp.config.WxMpAutoConfiguration
|
||||||
|
|
||||||
|
# 数据源配置(使用新建的 MySQL 容器)
|
||||||
|
datasource:
|
||||||
|
dynamic:
|
||||||
|
datasource:
|
||||||
|
master:
|
||||||
|
# 使用 Docker 服务名连接 MySQL
|
||||||
|
url: jdbc:mysql://mysql:3306/xlcp?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8
|
||||||
|
username: root
|
||||||
|
password: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
slave:
|
||||||
|
# 从库配置(可选,如果不需要可以删除或保持与主库相同)
|
||||||
|
url: jdbc:mysql://mysql:3306/xlcp?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8
|
||||||
|
username: root
|
||||||
|
password: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
hikari:
|
||||||
|
# 连接池配置
|
||||||
|
maximum-pool-size: 20
|
||||||
|
minimum-idle: 5
|
||||||
|
idle-timeout: 600000
|
||||||
|
connection-timeout: 30000
|
||||||
|
max-lifetime: 1800000
|
||||||
|
pool-name: PrisonHikariCP
|
||||||
|
# 连接健康检测
|
||||||
|
connection-test-query: SELECT 1
|
||||||
|
|
||||||
|
# Redis 配置(使用新建的 Redis 容器)
|
||||||
|
data:
|
||||||
|
redis:
|
||||||
|
host: redis
|
||||||
|
port: 6379
|
||||||
|
password: ${REDIS_PASSWORD:-Xlcp2025Redis}
|
||||||
|
database: 0
|
||||||
|
timeout: 10000ms
|
||||||
|
lettuce:
|
||||||
|
pool:
|
||||||
|
max-active: 20
|
||||||
|
max-wait: -1ms
|
||||||
|
max-idle: 10
|
||||||
|
min-idle: 0
|
||||||
|
shutdown-timeout: 100ms
|
||||||
|
|
||||||
|
# 文件上传配置
|
||||||
|
servlet:
|
||||||
|
multipart:
|
||||||
|
enabled: true
|
||||||
|
max-file-size: 100MB
|
||||||
|
max-request-size: 100MB
|
||||||
|
file-size-threshold: 2KB
|
||||||
|
|
||||||
|
# Jackson 配置
|
||||||
|
jackson:
|
||||||
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
|
time-zone: GMT+8
|
||||||
|
serialization:
|
||||||
|
write-dates-as-timestamps: false
|
||||||
|
|
||||||
|
# 服务器配置
|
||||||
|
server:
|
||||||
|
port: 48080
|
||||||
|
servlet:
|
||||||
|
context-path: /
|
||||||
|
compression:
|
||||||
|
enabled: true
|
||||||
|
mime-types: application/json,application/xml,text/html,text/xml,text/plain
|
||||||
|
error:
|
||||||
|
include-message: always
|
||||||
|
include-binding-errors: always
|
||||||
|
|
||||||
|
# 应用配置
|
||||||
|
app:
|
||||||
|
name: XL监狱综合管理平台
|
||||||
|
version: 1.0.0
|
||||||
|
|
||||||
|
# 验证码配置
|
||||||
|
captcha:
|
||||||
|
enabled: true
|
||||||
|
type: math
|
||||||
|
|
||||||
|
# 文件上传配置
|
||||||
|
upload:
|
||||||
|
path: ./data/upload
|
||||||
|
avatar-path: ./data/upload/avatar
|
||||||
|
cache-path: ./data/upload/cache
|
||||||
|
|
||||||
|
# XSS 过滤配置
|
||||||
|
security:
|
||||||
|
xss:
|
||||||
|
enabled: true
|
||||||
|
exclude-urls:
|
||||||
|
- /admin/ck/uploadImage
|
||||||
|
- /admin/oss/uploadToAliCloudV2
|
||||||
|
- /admin/oss/uploadToTencentCloudV2
|
||||||
|
|
||||||
|
# 日志配置
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
root: INFO
|
||||||
|
cn.iocoder.yudao: DEBUG
|
||||||
|
cn.iocoder.yudao.module.prison: DEBUG
|
||||||
|
file:
|
||||||
|
name: logs/yudao-server.log
|
||||||
|
logback:
|
||||||
|
rollingpolicy:
|
||||||
|
max-history: 30
|
||||||
|
max-file-size: 100MB
|
||||||
|
total-size-cap: 3GB
|
||||||
|
|
||||||
|
# MyBatis Plus 配置
|
||||||
|
mybatis-plus:
|
||||||
|
mapper-locations: classpath*:mapper/**/*.xml
|
||||||
|
type-aliases-package: cn.iocoder.yudao.module.*.dal.dataobject
|
||||||
|
global-config:
|
||||||
|
db-config:
|
||||||
|
id-type: auto
|
||||||
|
logic-delete-field: deleted
|
||||||
|
logic-delete-value: 1
|
||||||
|
logic-not-delete-value: 0
|
||||||
|
banner: false
|
||||||
|
configuration:
|
||||||
|
map-underscore-to-camel-case: true
|
||||||
|
cache-enabled: false
|
||||||
|
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
|
|
||||||
|
# Actuator 监控配置
|
||||||
|
management:
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: health,info,metrics,prometheus
|
||||||
|
base-path: /actuator
|
||||||
|
endpoint:
|
||||||
|
health:
|
||||||
|
show-details: always
|
||||||
|
metrics:
|
||||||
|
tags:
|
||||||
|
application: ${spring.application.name}
|
||||||
|
|
||||||
|
# LLM 配置(用于危险评估智能分析)
|
||||||
|
llm:
|
||||||
|
local:
|
||||||
|
base-url: ${LLM_BASE_URL:http://127.0.0.1:2100/v1}
|
||||||
|
api-key: ${LLM_API_KEY:}
|
||||||
|
model: ${LLM_MODEL:qwen3}
|
||||||
|
timeout-seconds: ${LLM_TIMEOUT:120}
|
||||||
|
|
||||||
|
# 微信公众号配置
|
||||||
|
wx:
|
||||||
|
mp:
|
||||||
|
app-id: wxf56b1542b9e85f8a
|
||||||
|
secret: 496379dcef1ba869e9234de8d598cfd3
|
||||||
|
config-storage:
|
||||||
|
type: RedisTemplate
|
||||||
|
key-prefix: wx
|
||||||
|
http-client-type: HttpClient
|
||||||
|
miniapp:
|
||||||
|
appid: wxc4598c446f8a9cb3
|
||||||
|
secret: 4a1a04e07f6a4a0751b39c3064a92c8b
|
||||||
|
config-storage:
|
||||||
|
type: RedisTemplate
|
||||||
|
key-prefix: wa
|
||||||
|
http-client-type: HttpClient
|
||||||
|
|
||||||
100
deploy/docker-compose.yml
Normal file
100
deploy/docker-compose.yml
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
name: xlcp
|
||||||
|
|
||||||
|
services:
|
||||||
|
# MySQL 数据库
|
||||||
|
mysql:
|
||||||
|
container_name: xlcp-mysql
|
||||||
|
image: mysql:8.0
|
||||||
|
user: "0:0"
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||||
|
MYSQL_DATABASE: ${MYSQL_DATABASE:-xlcp}
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
ports:
|
||||||
|
- "${MYSQL_PORT:-3306}:3306"
|
||||||
|
volumes:
|
||||||
|
- ./data/mysql:/var/lib/mysql
|
||||||
|
- ./sql/prison_schema.sql:/docker-entrypoint-initdb.d/01-prison_schema.sql:ro
|
||||||
|
command:
|
||||||
|
- --character-set-server=utf8mb4
|
||||||
|
- --collation-server=utf8mb4_unicode_ci
|
||||||
|
- --default-authentication-plugin=mysql_native_password
|
||||||
|
- --skip-name-resolve
|
||||||
|
networks:
|
||||||
|
- xlcp-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
# Redis 缓存
|
||||||
|
redis:
|
||||||
|
container_name: xlcp-redis
|
||||||
|
image: redis:7-alpine
|
||||||
|
user: "0:0"
|
||||||
|
restart: unless-stopped
|
||||||
|
command: >
|
||||||
|
sh -c "redis-server --requirepass ${REDIS_PASSWORD:-Xlcp2025Redis} --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru"
|
||||||
|
ports:
|
||||||
|
- "${REDIS_PORT:-6380}:6379"
|
||||||
|
volumes:
|
||||||
|
- ./data/redis:/data
|
||||||
|
networks:
|
||||||
|
- xlcp-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
# 后端服务
|
||||||
|
backend:
|
||||||
|
container_name: xlcp-backend
|
||||||
|
image: eclipse-temurin:21-jre-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
mysql:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
|
ports:
|
||||||
|
- "${BACKEND_PORT:-48080}:48080"
|
||||||
|
environment:
|
||||||
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod}
|
||||||
|
JAVA_OPTS: ${JAVA_OPTS:--Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs}
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||||
|
REDIS_PASSWORD: ${REDIS_PASSWORD:-Xlcp2025Redis}
|
||||||
|
volumes:
|
||||||
|
- ./logs/backend:/logs
|
||||||
|
- ./data/upload:/app/data/upload
|
||||||
|
- ./config/application-prod.yaml:/app/application-prod.yaml:ro
|
||||||
|
- ./backend/yudao-server/target/yudao-server.jar:/app/app.jar:ro
|
||||||
|
working_dir: /app
|
||||||
|
networks:
|
||||||
|
- xlcp-network
|
||||||
|
command: ["sh", "-c", "apk add --no-cache curl tzdata >/dev/null 2>&1 && java $$JAVA_OPTS -jar /app/app.jar"]
|
||||||
|
|
||||||
|
# 前端 Nginx
|
||||||
|
frontend:
|
||||||
|
container_name: xlcp-frontend
|
||||||
|
image: nginx:1.25-alpine
|
||||||
|
user: "0:0"
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${FRONTEND_PORT:-18080}:80"
|
||||||
|
- "${FRONTEND_HTTPS_PORT:-18443}:443"
|
||||||
|
volumes:
|
||||||
|
- ./docker/frontend/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- ./frontend/dist:/usr/share/nginx/html:ro
|
||||||
|
- ./logs/nginx:/var/log/nginx
|
||||||
|
- ./data/ssl:/etc/nginx/ssl
|
||||||
|
networks:
|
||||||
|
- xlcp-network
|
||||||
|
|
||||||
|
networks:
|
||||||
|
xlcp-network:
|
||||||
|
name: xlcp-network
|
||||||
|
driver: bridge
|
||||||
188
deploy/scripts/check-remote.sh
Executable file
188
deploy/scripts/check-remote.sh
Executable file
@ -0,0 +1,188 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 远程服务器架构检查脚本
|
||||||
|
# 用法: ./check-remote.sh
|
||||||
|
|
||||||
|
REMOTE_SERVER="${1:-root@192.168.10.150}"
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "检查远程服务器: $REMOTE_SERVER"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 SSH 连接
|
||||||
|
echo "[1/8] 检查 SSH 连接..."
|
||||||
|
if ! ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$REMOTE_SERVER" "echo 'SSH 连接成功'" 2>/dev/null; then
|
||||||
|
echo "❌ SSH 连接失败"
|
||||||
|
echo ""
|
||||||
|
echo "请检查:"
|
||||||
|
echo " 1. SSH 免密登录是否配置?"
|
||||||
|
echo " 2. 是否可以手动: ssh $REMOTE_SERVER"
|
||||||
|
echo " 3. 远程服务器 IP 是否正确?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✅ SSH 连接正常"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查架构
|
||||||
|
echo "[2/8] 检查系统架构..."
|
||||||
|
ARCH=$(ssh "$REMOTE_SERVER" "uname -m" 2>/dev/null)
|
||||||
|
echo "✅ 系统架构: $ARCH"
|
||||||
|
|
||||||
|
# 映射到 Docker 平台
|
||||||
|
case "$ARCH" in
|
||||||
|
x86_64)
|
||||||
|
DOCKER_PLATFORM="linux/amd64"
|
||||||
|
echo "✅ Docker 平台: linux/amd64 (Intel/AMD 64位)"
|
||||||
|
;;
|
||||||
|
aarch64)
|
||||||
|
DOCKER_PLATFORM="linux/arm64"
|
||||||
|
echo "✅ Docker 平台: linux/arm64 (ARM 64位)"
|
||||||
|
;;
|
||||||
|
armv7l)
|
||||||
|
DOCKER_PLATFORM="linux/arm/v7"
|
||||||
|
echo "✅ Docker 平台: linux/arm/v7 (ARM 32位)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
DOCKER_PLATFORM="unknown"
|
||||||
|
echo "⚠️ 未知架构: $ARCH"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查操作系统
|
||||||
|
echo "[3/8] 检查操作系统..."
|
||||||
|
OS_INFO=$(ssh "$REMOTE_SERVER" "cat /etc/os-release | grep -E '^(NAME|VERSION)=' 2>/dev/null || cat /etc/issue" 2>/dev/null)
|
||||||
|
echo "✅ 操作系统:"
|
||||||
|
echo "$OS_INFO"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 Docker
|
||||||
|
echo "[4/8] 检查 Docker..."
|
||||||
|
if DOCKER_VERSION=$(ssh "$REMOTE_SERVER" "docker --version" 2>/dev/null); then
|
||||||
|
echo "✅ $DOCKER_VERSION"
|
||||||
|
|
||||||
|
# 检查 Docker 是否能拉取镜像
|
||||||
|
echo " 测试镜像拉取能力..."
|
||||||
|
if ssh "$REMOTE_SERVER" "docker pull hello-world:latest > /dev/null 2>&1"; then
|
||||||
|
echo " ✅ Docker Hub 访问正常"
|
||||||
|
CAN_PULL_IMAGES="yes"
|
||||||
|
else
|
||||||
|
echo " ❌ 无法拉取镜像 (可能需要配置镜像加速器)"
|
||||||
|
CAN_PULL_IMAGES="no"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ Docker 未安装"
|
||||||
|
echo ""
|
||||||
|
echo "请先安装 Docker:"
|
||||||
|
if echo "$OS_INFO" | grep -qi "ubuntu"; then
|
||||||
|
echo " curl -fsSL https://get.docker.com | sh"
|
||||||
|
elif echo "$OS_INFO" | grep -qi "centos"; then
|
||||||
|
echo " curl -fsSL https://get.docker.com | sh"
|
||||||
|
fi
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 Docker Compose
|
||||||
|
echo "[5/8] 检查 Docker Compose..."
|
||||||
|
if COMPOSE_VERSION=$(ssh "$REMOTE_SERVER" "docker compose version 2>/dev/null"); then
|
||||||
|
echo "✅ $COMPOSE_VERSION (docker compose v2)"
|
||||||
|
elif COMPOSE_VERSION=$(ssh "$REMOTE_SERVER" "docker-compose --version" 2>/dev/null); then
|
||||||
|
echo "✅ $COMPOSE_VERSION (docker-compose v1)"
|
||||||
|
else
|
||||||
|
echo "❌ Docker Compose 未安装"
|
||||||
|
echo ""
|
||||||
|
echo "请先安装 Docker Compose:"
|
||||||
|
echo " sudo curl -L \"https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-\$(uname -s)-\$(uname -m)\" -o /usr/local/bin/docker-compose"
|
||||||
|
echo " sudo chmod +x /usr/local/bin/docker-compose"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查磁盘空间
|
||||||
|
echo "[6/8] 检查磁盘空间..."
|
||||||
|
DISK_INFO=$(ssh "$REMOTE_SERVER" "df -h / | tail -1")
|
||||||
|
echo "✅ 磁盘使用情况:"
|
||||||
|
echo "$DISK_INFO"
|
||||||
|
|
||||||
|
AVAILABLE=$(ssh "$REMOTE_SERVER" "df -BG / | tail -1 | awk '{print \$4}' | sed 's/G//'")
|
||||||
|
if [ "$AVAILABLE" -lt 10 ]; then
|
||||||
|
echo " ⚠️ 磁盘空间不足: ${AVAILABLE}G 可用,建议至少 20G"
|
||||||
|
else
|
||||||
|
echo " ✅ 磁盘空间充足"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查内存
|
||||||
|
echo "[7/8] 检查内存..."
|
||||||
|
MEM_INFO=$(ssh "$REMOTE_SERVER" "free -h | grep Mem")
|
||||||
|
echo "✅ 内存使用情况:"
|
||||||
|
echo "$MEM_INFO"
|
||||||
|
|
||||||
|
TOTAL_MEM=$(ssh "$REMOTE_SERVER" "free -g | grep Mem | awk '{print \$2}'")
|
||||||
|
if [ "$TOTAL_MEM" -lt 2 ]; then
|
||||||
|
echo " ⚠️ 内存不足: ${TOTAL_MEM}G,建议至少 4G"
|
||||||
|
else
|
||||||
|
echo " ✅ 内存充足"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查端口占用
|
||||||
|
echo "[8/8] 检查端口占用..."
|
||||||
|
PORTS_TO_CHECK="3306 6379 48080 80"
|
||||||
|
echo "检查端口: $PORTS_TO_CHECK"
|
||||||
|
PORTS_OCCUPIED=()
|
||||||
|
for port in $PORTS_TO_CHECK; do
|
||||||
|
if ssh "$REMOTE_SERVER" "netstat -tlnp 2>/dev/null | grep -E \":$port\s\" || ss -tlnp 2>/dev/null | grep -E \":$port\s\"" 2>/dev/null; then
|
||||||
|
echo " ⚠️ 端口 $port 已被占用"
|
||||||
|
PORTS_OCCUPIED+=("$port")
|
||||||
|
else
|
||||||
|
echo " ✅ 端口 $port 可用"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#PORTS_OCCUPIED[@]} -gt 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "⚠️ 以下端口已被占用: ${PORTS_OCCUPIED[*]}"
|
||||||
|
echo "请修改 .env 文件中的端口配置或停止占用端口的服务"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "检查完成"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
echo "架构信息总结:"
|
||||||
|
echo " 系统架构: $ARCH"
|
||||||
|
echo " Docker 平台: $DOCKER_PLATFORM"
|
||||||
|
echo " Docker Hub: $([ "$CAN_PULL_IMAGES" = "yes" ] && echo "✅ 可访问" || echo "❌ 受限")"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Docker镜像下载建议:"
|
||||||
|
if [ "$CAN_PULL_IMAGES" = "yes" ]; then
|
||||||
|
echo " ✅ 服务器可以直接拉取镜像"
|
||||||
|
echo " 推荐使用: ./deploy.sh (在线部署)"
|
||||||
|
else
|
||||||
|
echo " ❌ 服务器无法直接拉取镜像"
|
||||||
|
echo " 推荐使用: ./save-images.sh (离线部署)"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "所需镜像及平台支持:"
|
||||||
|
echo " mysql:8.0 支持 $DOCKER_PLATFORM ✅"
|
||||||
|
echo " redis:7-alpine 支持 $DOCKER_PLATFORM ✅"
|
||||||
|
echo " nginx:1.25-alpine 支持 $DOCKER_PLATFORM ✅"
|
||||||
|
echo " node:20-alpine 支持 $DOCKER_PLATFORM ✅"
|
||||||
|
echo " eclipse-temurin:21-jre 支持 $DOCKER_PLATFORM ✅"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "下一步操作:"
|
||||||
|
if [ "$CAN_PULL_IMAGES" = "yes" ]; then
|
||||||
|
echo " 1. 在线部署: ./deploy.sh"
|
||||||
|
echo " 2. 或远程构建: ./remote-build.sh"
|
||||||
|
else
|
||||||
|
echo " 1. 本地打包: ./save-images.sh"
|
||||||
|
echo " 2. 上传镜像: cd images-archive && ./upload.sh"
|
||||||
|
echo " 3. 远程构建: ./remote-build.sh"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
131
deploy/scripts/deploy-xlcp.sh
Executable file
131
deploy/scripts/deploy-xlcp.sh
Executable file
@ -0,0 +1,131 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_NAME="xlcp"
|
||||||
|
REMOTE_SERVER="${1:-root@192.168.10.150}"
|
||||||
|
REMOTE_DEPLOY_DIR="${REMOTE_DEPLOY_DIR:-/projects/data/xlcp}"
|
||||||
|
LOCAL_DIR="$(cd "$(dirname "$0")" && pwd)/.."
|
||||||
|
|
||||||
|
log_info() { echo "[INFO] $1"; }
|
||||||
|
log_success() { echo "[SUCCESS] $1"; }
|
||||||
|
log_error() { echo "[ERROR] $1"; exit 1; }
|
||||||
|
|
||||||
|
check_files() {
|
||||||
|
log_info "检查必要文件..."
|
||||||
|
local files=(
|
||||||
|
"$LOCAL_DIR/backend/yudao-server/target/yudao-server.jar"
|
||||||
|
"$LOCAL_DIR/frontend/dist/index.html"
|
||||||
|
"$LOCAL_DIR/deploy/docker-compose.yml"
|
||||||
|
"$LOCAL_DIR/deploy/config/application-prod.yaml"
|
||||||
|
"$LOCAL_DIR/deploy/docker/frontend/nginx.conf"
|
||||||
|
"$LOCAL_DIR/deploy/sql/prison_schema.sql"
|
||||||
|
)
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
[ -f "$file" ] || log_error "文件不存在: $file"
|
||||||
|
done
|
||||||
|
log_success "所有必要文件存在"
|
||||||
|
}
|
||||||
|
|
||||||
|
upload_files() {
|
||||||
|
log_info "上传文件到 $REMOTE_SERVER..."
|
||||||
|
ssh "$REMOTE_SERVER" "mkdir -p $REMOTE_DEPLOY_DIR/{config,docker/frontend,sql,data,logs,backend/yudao-server/target}"
|
||||||
|
|
||||||
|
rsync -avz --delete --exclude '*.tar.gz' --exclude '.git' \
|
||||||
|
--exclude 'node_modules' --exclude 'target' \
|
||||||
|
"$LOCAL_DIR/deploy/" "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/deploy/"
|
||||||
|
rsync -avz --progress "$LOCAL_DIR/backend/yudao-server/target/yudao-server.jar" \
|
||||||
|
"$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/backend/yudao-server/target/"
|
||||||
|
rsync -avz --delete --progress --exclude 'node_modules' \
|
||||||
|
"$LOCAL_DIR/frontend/dist/" "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/frontend/dist/"
|
||||||
|
log_success "文件上传完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
init_remote_dirs() {
|
||||||
|
log_info "初始化远程目录..."
|
||||||
|
ssh "$REMOTE_SERVER" "cd $REMOTE_DEPLOY_DIR && mkdir -p data/{mysql,redis,upload} logs/{backend,nginx} ssl && chmod -R 777 data/ logs/"
|
||||||
|
log_success "远程目录初始化完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
start_services() {
|
||||||
|
log_info "启动服务..."
|
||||||
|
ssh "$REMOTE_SERVER" "cd $REMOTE_DEPLOY_DIR/deploy && docker compose down -v 2>/dev/null; docker compose up -d"
|
||||||
|
log_success "服务启动命令已执行"
|
||||||
|
}
|
||||||
|
|
||||||
|
health_check() {
|
||||||
|
log_info "进行健康检查..."
|
||||||
|
local server_ip=$(echo "$REMOTE_SERVER" | cut -d'@' -f2)
|
||||||
|
for i in {1..30}; do
|
||||||
|
curl -f -s "http://$server_ip:48080/actuator/health" > /dev/null 2>&1 && { log_success "后端服务正常"; break; }
|
||||||
|
echo -n "."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
log_info "检查前端..."
|
||||||
|
curl -f -s "http://$server_ip/" > /dev/null 2>&1 && log_success "前端服务正常" || log_warn "前端可能未启动"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_access_info() {
|
||||||
|
local server_ip=$(echo "$REMOTE_SERVER" | cut -d'@' -f2)
|
||||||
|
echo ""
|
||||||
|
echo "========================================="
|
||||||
|
echo "部署成功!"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
echo "访问地址:"
|
||||||
|
echo " 前端: http://$server_ip/"
|
||||||
|
echo " 后端 API: http://$server_ip:48080/admin-api/"
|
||||||
|
echo " 健康检查: http://$server_ip:48080/actuator/health"
|
||||||
|
echo ""
|
||||||
|
echo "管理命令:"
|
||||||
|
echo " SSH: ssh $REMOTE_SERVER"
|
||||||
|
echo " 查看日志: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose logs -f'"
|
||||||
|
echo " 重启服务: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose restart'"
|
||||||
|
echo " 停止服务: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose down'"
|
||||||
|
echo ""
|
||||||
|
echo "数据目录: $REMOTE_DEPLOY_DIR/data"
|
||||||
|
echo "日志目录: $REMOTE_DEPLOY_DIR/logs"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_help() {
|
||||||
|
echo "用法: $0 [remote_server]"
|
||||||
|
echo ""
|
||||||
|
echo "参数:"
|
||||||
|
echo " remote_server 远程服务器地址 (默认: root@192.168.10.150)"
|
||||||
|
echo ""
|
||||||
|
echo "环境变量:"
|
||||||
|
echo " REMOTE_DEPLOY_DIR 远程部署目录 (默认: /projects/data/xlcp)"
|
||||||
|
echo ""
|
||||||
|
echo "示例:"
|
||||||
|
echo " $0 # 部署到默认服务器"
|
||||||
|
echo " $0 root@192.168.10.150 # 部署到指定服务器"
|
||||||
|
echo " REMOTE_DEPLOY_DIR=/opt/xlcp $0 # 自定义部署目录"
|
||||||
|
echo ""
|
||||||
|
echo "检查文件:"
|
||||||
|
echo " backend/yudao-server/target/yudao-server.jar"
|
||||||
|
echo " frontend/dist/"
|
||||||
|
echo " deploy/docker-compose.yml"
|
||||||
|
echo " deploy/config/application-prod.yaml"
|
||||||
|
echo " deploy/docker/frontend/nginx.conf"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
echo "========================================="
|
||||||
|
echo "XL监狱综合管理平台 - 部署脚本"
|
||||||
|
echo "========================================="
|
||||||
|
|
||||||
|
[[ "$1" == "--help" || "$1" == "-h" ]] && { show_help; exit 0; }
|
||||||
|
|
||||||
|
log_info "项目: $PROJECT_NAME, 服务器: $REMOTE_SERVER"
|
||||||
|
log_info "部署目录: $REMOTE_DEPLOY_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
check_files
|
||||||
|
upload_files
|
||||||
|
init_remote_dirs
|
||||||
|
start_services
|
||||||
|
health_check
|
||||||
|
show_access_info
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
94
deploy/scripts/init-db.sh
Executable file
94
deploy/scripts/init-db.sh
Executable file
@ -0,0 +1,94 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
# 日志函数
|
||||||
|
log_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查 MySQL 连接
|
||||||
|
check_mysql() {
|
||||||
|
local mysql_host="${MYSQL_HOST:-localhost}"
|
||||||
|
local mysql_port="${MYSQL_PORT:-3306}"
|
||||||
|
local mysql_user="${MYSQL_USER:-root}"
|
||||||
|
local mysql_password="${MYSQL_PASSWORD:-Prison2024!@}"
|
||||||
|
|
||||||
|
log_info "检查 MySQL 连接..."
|
||||||
|
|
||||||
|
if ! docker exec xlcp-mysql mysqladmin ping -h "$mysql_host" -P "$mysql_port" -u "$mysql_user" -p"$mysql_password" 2>/dev/null; then
|
||||||
|
log_error "无法连接到 MySQL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "MySQL 连接正常"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化数据库
|
||||||
|
init_database() {
|
||||||
|
log_info "初始化数据库..."
|
||||||
|
|
||||||
|
docker exec -i xlcp-mysql mysql -u root -p"${MYSQL_PASSWORD:-Prison2024!@}" prison < ./sql/prison_schema.sql || {
|
||||||
|
log_error "数据库初始化失败"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success "数据库初始化完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 验证数据库
|
||||||
|
verify_database() {
|
||||||
|
log_info "验证数据库表结构..."
|
||||||
|
|
||||||
|
local table_count=$(docker exec xlcp-mysql mysql -u root -p"${MYSQL_PASSWORD:-Prison2024!@}" prison -e "SHOW TABLES;" 2>/dev/null | wc -l)
|
||||||
|
|
||||||
|
if [ "$table_count" -lt 10 ]; then
|
||||||
|
log_error "数据库表数量异常: $table_count"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "数据库验证通过 (共 $table_count 张表)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
main() {
|
||||||
|
log_info "========================================="
|
||||||
|
log_info "XL监狱综合管理平台 - 数据库初始化"
|
||||||
|
log_info "========================================="
|
||||||
|
|
||||||
|
# 切换到脚本所在目录的上级目录(deploy 目录)
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
# 检查 MySQL
|
||||||
|
check_mysql
|
||||||
|
|
||||||
|
# 初始化数据库
|
||||||
|
read -p "是否初始化数据库? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
init_database
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 验证数据库
|
||||||
|
verify_database
|
||||||
|
|
||||||
|
log_success "========================================="
|
||||||
|
log_success "数据库初始化完成!"
|
||||||
|
log_success "========================================="
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
48
deploy/scripts/init-permissions.sh
Executable file
48
deploy/scripts/init-permissions.sh
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
log_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化目录权限
|
||||||
|
init_permissions() {
|
||||||
|
log_info "初始化目录权限..."
|
||||||
|
|
||||||
|
# 创建必要的目录
|
||||||
|
mkdir -p data/{mysql,redis,upload}
|
||||||
|
mkdir -p logs/{backend,nginx}
|
||||||
|
|
||||||
|
# 设置目录权限为 777(开发环境)
|
||||||
|
# 这样任何容器用户都可以写入
|
||||||
|
chmod -R 777 data/ logs/
|
||||||
|
|
||||||
|
log_success "目录权限已设置"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查是否在正确的目录
|
||||||
|
if [ ! -f "docker-compose.yml" ]; then
|
||||||
|
echo "错误: 请在 deploy 目录下运行此脚本"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
init_permissions
|
||||||
|
|
||||||
|
log_success "初始化完成!"
|
||||||
|
log_info "目录结构:"
|
||||||
|
ls -la data/ logs/
|
||||||
100
deploy/scripts/save-images-xlcp.sh
Executable file
100
deploy/scripts/save-images-xlcp.sh
Executable file
@ -0,0 +1,100 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
OUTPUT_DIR="./xlcp-images"
|
||||||
|
IMAGES=(
|
||||||
|
"mysql:8.0"
|
||||||
|
"redis:7-alpine"
|
||||||
|
"eclipse-temurin:21-jre-alpine"
|
||||||
|
"nginx:1.25-alpine"
|
||||||
|
)
|
||||||
|
|
||||||
|
log_info() { echo "[INFO] $1"; }
|
||||||
|
log_success() { echo "[SUCCESS] $1"; }
|
||||||
|
log_error() { echo "[ERROR] $1"; exit 1; }
|
||||||
|
|
||||||
|
mkdir -p "$OUTPUT_DIR"
|
||||||
|
|
||||||
|
log_info "拉取 Docker 镜像..."
|
||||||
|
for image in "${IMAGES[@]}"; do
|
||||||
|
log_info "拉取 $image..."
|
||||||
|
docker pull "$image"
|
||||||
|
done
|
||||||
|
|
||||||
|
log_info "导出镜像到 tar 文件..."
|
||||||
|
for image in "${IMAGES[@]}"; do
|
||||||
|
image_name=$(echo "$image" | tr ':/' '_')
|
||||||
|
log_info "导出 ${image} -> ${image_name}.tar"
|
||||||
|
docker save "$image" | gzip > "$OUTPUT_DIR/${image_name}.tar.gz"
|
||||||
|
done
|
||||||
|
|
||||||
|
cat > "$OUTPUT_DIR/upload.sh" << 'UPLOAD_EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
REMOTE_SERVER="${1:-root@192.168.10.150}"
|
||||||
|
REMOTE_DIR="${REMOTE_DEPLOY_DIR:-/projects/data/xlcp}"
|
||||||
|
echo "上传镜像到 $REMOTE_SERVER..."
|
||||||
|
for file in *.tar.gz; do
|
||||||
|
echo "上传 $file..."
|
||||||
|
scp "$file" "$REMOTE_SERVER:$REMOTE_DIR/images-archive/"
|
||||||
|
done
|
||||||
|
echo "上传完成"
|
||||||
|
UPLOAD_EOF
|
||||||
|
chmod +x "$OUTPUT_DIR/upload.sh"
|
||||||
|
|
||||||
|
cat > "$OUTPUT_DIR/load.sh" << 'LOAD_EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
for file in *.tar.gz; do
|
||||||
|
echo "加载 $file..."
|
||||||
|
docker load -i "$file"
|
||||||
|
done
|
||||||
|
echo "所有镜像加载完成"
|
||||||
|
docker images | grep -E "mysql|redis|eclipse-temurin|nginx"
|
||||||
|
LOAD_EOF
|
||||||
|
chmod +x "$OUTPUT_DIR/load.sh"
|
||||||
|
|
||||||
|
cat > "$OUTPUT_DIR/README.md" << 'README_EOF'
|
||||||
|
# XL监狱综合管理平台 - Docker 镜像包
|
||||||
|
|
||||||
|
## 镜像列表
|
||||||
|
|
||||||
|
| 镜像 | 用途 |
|
||||||
|
|------|------|
|
||||||
|
| mysql:8.0 | 数据库 |
|
||||||
|
| redis:7-alpine | 缓存 |
|
||||||
|
| eclipse-temurin:21-jre-alpine | 后端运行 |
|
||||||
|
| nginx:1.25-alpine | 前端服务 |
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
### 1. 上传到服务器
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd images-archive
|
||||||
|
./upload.sh root@192.168.10.150
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 在服务器加载镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.10.150
|
||||||
|
cd /projects/data/xlcp/images-archive
|
||||||
|
./load.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 验证镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker images | grep -E "mysql|redis|eclipse-temurin|nginx"
|
||||||
|
```
|
||||||
|
README_EOF
|
||||||
|
|
||||||
|
log_success "镜像打包完成!"
|
||||||
|
echo ""
|
||||||
|
echo "镜像包位置: $OUTPUT_DIR/"
|
||||||
|
ls -lh "$OUTPUT_DIR/"
|
||||||
|
echo ""
|
||||||
|
echo "使用方法:"
|
||||||
|
echo " 1. 上传: cd $OUTPUT_DIR && ./upload.sh root@192.168.10.150"
|
||||||
|
echo " 2. 加载: ssh root@192.168.10.150 'cd /projects/data/xlcp/images-archive && ./load.sh'"
|
||||||
290
deploy/sql/prison_schema.sql
Normal file
290
deploy/sql/prison_schema.sql
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
-- ============================================
|
||||||
|
-- XL监狱综合管理平台 - 数据库初始化脚本
|
||||||
|
-- 复用 RAGFlow MySQL 镜像创建独立数据库
|
||||||
|
-- ============================================
|
||||||
|
|
||||||
|
-- 创建数据库
|
||||||
|
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 罪犯信息表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_prisoner` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '罪犯ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||||
|
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||||
|
`gender` tinyint NOT NULL COMMENT '性别:1-男 2-女',
|
||||||
|
`birthday` date DEFAULT NULL COMMENT '出生日期',
|
||||||
|
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
||||||
|
`ethnicity` varchar(50) DEFAULT NULL COMMENT '民族',
|
||||||
|
`native_place` varchar(100) DEFAULT NULL COMMENT '籍贯',
|
||||||
|
`education` tinyint DEFAULT NULL COMMENT '文化程度:1-文盲 2-小学 3-初中 4-高中 5-中专 6-大专 7-本科 8-硕士 9-博士',
|
||||||
|
`occupation` varchar(50) DEFAULT NULL COMMENT '入狱前职业',
|
||||||
|
`address` varchar(500) DEFAULT NULL COMMENT '家庭住址',
|
||||||
|
`crime` varchar(200) NOT NULL COMMENT '罪名',
|
||||||
|
`sentence_years` int DEFAULT 0 COMMENT '刑期(年)',
|
||||||
|
`sentence_months` int DEFAULT 0 COMMENT '刑期(月)',
|
||||||
|
`life_imprisonment` tinyint DEFAULT 0 COMMENT '是否无期:0-否 1-是',
|
||||||
|
`death_sentence_reprieve` tinyint DEFAULT 0 COMMENT '是否死缓:0-否 1-是',
|
||||||
|
`court_name` varchar(100) DEFAULT NULL COMMENT '判决法院',
|
||||||
|
`judgment_date` date DEFAULT NULL COMMENT '判决日期',
|
||||||
|
`judgment_no` varchar(50) DEFAULT NULL COMMENT '判决书编号',
|
||||||
|
`original_sentence` varchar(100) DEFAULT NULL COMMENT '原判刑期',
|
||||||
|
`imprisonment_date` date DEFAULT NULL COMMENT '入狱日期',
|
||||||
|
`release_date` date DEFAULT NULL COMMENT '释放日期',
|
||||||
|
`release_type` tinyint DEFAULT 0 COMMENT '释放类型:0-未知 1-刑满释放 2-假释 3-保外就医 4-减刑 5-暂予监外执行 6-特赦 7-死亡 8-其他',
|
||||||
|
`release_reason` varchar(500) DEFAULT NULL COMMENT '释放原因',
|
||||||
|
`photo` varchar(512) DEFAULT NULL COMMENT '照片URL',
|
||||||
|
`supervision_level` tinyint DEFAULT 2 COMMENT '监管等级:1-严管 2-普管 3-宽管',
|
||||||
|
`risk_level` tinyint DEFAULT 1 COMMENT '风险等级:1-低风险 2-中风险 3-高风险 4-极高风险',
|
||||||
|
`prison_area_id` bigint DEFAULT NULL COMMENT '监区ID',
|
||||||
|
`sub_area_id` bigint DEFAULT NULL COMMENT '分区ID',
|
||||||
|
`prison_cell_id` bigint DEFAULT NULL COMMENT '监室ID',
|
||||||
|
`marital_status` tinyint DEFAULT NULL COMMENT '婚姻状态:1-未婚 2-已婚 3-离异 4-丧偶',
|
||||||
|
`crime_type` varchar(100) DEFAULT NULL COMMENT '罪名类型',
|
||||||
|
`sentence` varchar(100) DEFAULT NULL COMMENT '刑期',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-在押 2-已释放 3-已死亡 4-假释',
|
||||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_prisoner_no` (`prisoner_no`, `tenant_id`),
|
||||||
|
KEY `idx_name` (`name`),
|
||||||
|
KEY `idx_id_card` (`id_card`),
|
||||||
|
KEY `idx_status` (`status`)
|
||||||
|
) ENGINE=InnoDB COMMENT='罪犯信息表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 监区信息表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_area` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '监区ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`name` varchar(50) NOT NULL COMMENT '监区名称',
|
||||||
|
`code` varchar(50) NOT NULL COMMENT '监区编码',
|
||||||
|
`type` tinyint DEFAULT NULL COMMENT '监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室',
|
||||||
|
`capacity` int DEFAULT NULL COMMENT '容纳人数',
|
||||||
|
`current_count` int DEFAULT 0 COMMENT '当前人数',
|
||||||
|
`sort` int DEFAULT 0 COMMENT '排序',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用',
|
||||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_code` (`code`, `tenant_id`),
|
||||||
|
KEY `idx_sort` (`sort`)
|
||||||
|
) ENGINE=InnoDB COMMENT='监区信息表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 监室信息表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_cell` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '监室ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`area_id` bigint NOT NULL COMMENT '所属监区ID',
|
||||||
|
`name` varchar(50) NOT NULL COMMENT '监室名称',
|
||||||
|
`code` varchar(50) NOT NULL COMMENT '监室编码',
|
||||||
|
`capacity` int DEFAULT NULL COMMENT '床位数量',
|
||||||
|
`current_count` int DEFAULT 0 COMMENT '当前人数',
|
||||||
|
`sort` int DEFAULT 0 COMMENT '排序',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用',
|
||||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_code` (`code`, `tenant_id`),
|
||||||
|
KEY `idx_area_id` (`area_id`)
|
||||||
|
) ENGINE=InnoDB COMMENT='监室信息表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 计分考核表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_score` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||||
|
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||||
|
`year` int NOT NULL COMMENT '考核年份',
|
||||||
|
`month` int NOT NULL COMMENT '考核月份',
|
||||||
|
`base_score` decimal(10,2) DEFAULT 0.00 COMMENT '基础分',
|
||||||
|
`reward_score` decimal(10,2) DEFAULT 0.00 COMMENT '加分',
|
||||||
|
`penalty_score` decimal(10,2) DEFAULT 0.00 COMMENT '扣分',
|
||||||
|
`total_score` decimal(10,2) DEFAULT 0.00 COMMENT '总分',
|
||||||
|
`level` tinyint DEFAULT NULL COMMENT '考核等级:1-优秀 2-良好 3-合格 4-不合格',
|
||||||
|
`assessor_id` bigint DEFAULT NULL COMMENT '考核人ID',
|
||||||
|
`assessor_name` varchar(50) DEFAULT NULL COMMENT '考核人姓名',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待审核 2-已通过 3-已驳回',
|
||||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||||
|
KEY `idx_year_month` (`year`, `month`)
|
||||||
|
) ENGINE=InnoDB COMMENT='计分考核表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 危险评估表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_risk_assessment` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '评估ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||||
|
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||||
|
`assessment_type` tinyint NOT NULL COMMENT '评估类型:1-入狱评估 2-定期评估 3-专项评估',
|
||||||
|
`assessment_date` date NOT NULL COMMENT '评估日期',
|
||||||
|
`violence_score` decimal(10,2) DEFAULT 0.00 COMMENT '暴力倾向得分',
|
||||||
|
`escape_score` decimal(10,2) DEFAULT 0.00 COMMENT '脱逃倾向得分',
|
||||||
|
`suicide_score` decimal(10,2) DEFAULT 0.00 COMMENT '自杀倾向得分',
|
||||||
|
`total_score` decimal(10,2) DEFAULT 0.00 COMMENT '综合得分',
|
||||||
|
`risk_level` tinyint NOT NULL COMMENT '风险等级:1-低风险 2-中风险 3-高风险 4-极高风险',
|
||||||
|
`risk_factors` varchar(500) DEFAULT NULL COMMENT '风险因素',
|
||||||
|
`suggestions` varchar(500) DEFAULT NULL COMMENT '管控建议',
|
||||||
|
`assessor_id` bigint DEFAULT NULL COMMENT '评估人ID',
|
||||||
|
`assessor_name` varchar(50) DEFAULT NULL COMMENT '评估人姓名',
|
||||||
|
`next_assessment_date` date DEFAULT NULL COMMENT '下次评估日期',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待审核 2-已通过',
|
||||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||||
|
KEY `idx_assessment_date` (`assessment_date`)
|
||||||
|
) ENGINE=InnoDB COMMENT='危险评估表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 消费记录表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_consumption` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||||
|
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||||
|
`type` tinyint NOT NULL COMMENT '类型:1-存款 2-消费 3-转账',
|
||||||
|
`amount` decimal(12,2) NOT NULL COMMENT '金额',
|
||||||
|
`balance` decimal(12,2) DEFAULT 0.00 COMMENT '账户余额',
|
||||||
|
`goods_name` varchar(100) DEFAULT NULL COMMENT '商品名称',
|
||||||
|
`goods_count` int DEFAULT 1 COMMENT '商品数量',
|
||||||
|
`order_no` varchar(64) DEFAULT NULL COMMENT '订单号',
|
||||||
|
`trade_time` datetime NOT NULL COMMENT '交易时间',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-成功 2-失败',
|
||||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||||
|
KEY `idx_trade_time` (`trade_time`),
|
||||||
|
KEY `idx_type` (`type`)
|
||||||
|
) ENGINE=InnoDB COMMENT='消费记录表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 问卷模板表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_questionnaire` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '问卷ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`title` varchar(200) NOT NULL COMMENT '问卷标题',
|
||||||
|
`type` tinyint NOT NULL COMMENT '问卷类型:1-心理测评 2-行为评估 3-满意度调查',
|
||||||
|
`description` varchar(500) DEFAULT NULL COMMENT '问卷说明',
|
||||||
|
`total_score` decimal(10,2) DEFAULT 100.00 COMMENT '总分',
|
||||||
|
`pass_score` decimal(10,2) DEFAULT 60.00 COMMENT '及格分',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-草稿 2-已发布 3-已禁用',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_type` (`type`),
|
||||||
|
KEY `idx_status` (`status`)
|
||||||
|
) ENGINE=InnoDB COMMENT='问卷模板表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 问卷问题表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_question` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '问题ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`questionnaire_id` bigint NOT NULL COMMENT '所属问卷ID',
|
||||||
|
`title` varchar(500) NOT NULL COMMENT '问题标题',
|
||||||
|
`type` tinyint NOT NULL COMMENT '问题类型:1-单选 2-多选 3-填空 4-评分',
|
||||||
|
`options` text COMMENT '选项JSON:[{label:"选项1",score:10},...]',
|
||||||
|
`score` decimal(10,2) DEFAULT 0.00 COMMENT '分值',
|
||||||
|
`sort` int DEFAULT 0 COMMENT '排序',
|
||||||
|
`is_required` bit(1) DEFAULT b'1' COMMENT '是否必答',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_questionnaire_id` (`questionnaire_id`)
|
||||||
|
) ENGINE=InnoDB COMMENT='问卷问题表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 问卷答题记录表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_questionnaire_record` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`questionnaire_id` bigint NOT NULL COMMENT '问卷ID',
|
||||||
|
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||||
|
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||||
|
`total_score` decimal(10,2) DEFAULT 0.00 COMMENT '得分',
|
||||||
|
`pass_status` tinyint DEFAULT NULL COMMENT '是否及格:1-及格 2-不及格',
|
||||||
|
`answer_time` datetime NOT NULL COMMENT '答题时间',
|
||||||
|
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-已完成 2-已过期',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_questionnaire_id` (`questionnaire_id`),
|
||||||
|
KEY `idx_prisoner_id` (`prisoner_id`)
|
||||||
|
) ENGINE=InnoDB COMMENT='问卷答题记录表';
|
||||||
|
|
||||||
|
-- ============================================
|
||||||
|
-- 罪犯监区变动记录表
|
||||||
|
-- ============================================
|
||||||
|
CREATE TABLE IF NOT EXISTS `prison_prisoner_area_log` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||||
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
|
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||||
|
`from_area_id` bigint DEFAULT NULL COMMENT '原监区ID',
|
||||||
|
`from_cell_id` bigint DEFAULT NULL COMMENT '原监室ID',
|
||||||
|
`to_area_id` bigint NOT NULL COMMENT '新监区ID',
|
||||||
|
`to_cell_id` bigint NOT NULL COMMENT '新监室ID',
|
||||||
|
`change_type` varchar(20) NOT NULL COMMENT '变动类型:调监区、调监室、入监、出监',
|
||||||
|
`reason` varchar(500) DEFAULT NULL COMMENT '变动原因',
|
||||||
|
`approve_no` varchar(50) DEFAULT NULL COMMENT '批准文号',
|
||||||
|
`operate_by` bigint NOT NULL COMMENT '操作人ID',
|
||||||
|
`operate_name` varchar(50) DEFAULT NULL COMMENT '操作人姓名',
|
||||||
|
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
|
||||||
|
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||||
|
KEY `idx_operate_time` (`operate_time`)
|
||||||
|
) ENGINE=InnoDB COMMENT='罪犯监区变动记录表';
|
||||||
284
deploy/sql/quartz.sql
Normal file
284
deploy/sql/quartz.sql
Normal file
File diff suppressed because one or more lines are too long
4087
deploy/sql/ruoyi-vue-pro.sql
Normal file
4087
deploy/sql/ruoyi-vue-pro.sql
Normal file
File diff suppressed because it is too large
Load Diff
756
docs/DEPLOYMENT.md
Normal file
756
docs/DEPLOYMENT.md
Normal file
@ -0,0 +1,756 @@
|
|||||||
|
# XL 监狱综合管理平台部署文档
|
||||||
|
|
||||||
|
## 1. 文档概述
|
||||||
|
|
||||||
|
本文档详细描述 XL 监狱综合管理平台在服务器 `root@192.168.10.150` 上的部署流程。该平台采用 Docker 容器化部署方式,包含 MySQL 数据库、Redis 缓存、Spring Boot 后端服务和 Nginx 前端服务。
|
||||||
|
|
||||||
|
### 1.1 系统架构
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 服务器 192.168.10.150 │
|
||||||
|
├─────────────────────────────────────────────────────────────────────┤
|
||||||
|
│ │
|
||||||
|
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ Docker 网络 (xlcp-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/xlcp
|
||||||
|
sudo mkdir -p /work/projects/xlcp/{backend,frontend,data/{mysql,redis},logs,sql}
|
||||||
|
|
||||||
|
# 设置目录所有者(请将 username 替换为实际用户名)
|
||||||
|
sudo chown -R $USER:$USER /work/projects/xlcp
|
||||||
|
|
||||||
|
# 进入项目目录
|
||||||
|
cd /work/projects/xlcp
|
||||||
|
```
|
||||||
|
|
||||||
|
目录结构说明:
|
||||||
|
|
||||||
|
```
|
||||||
|
/work/projects/xlcp/
|
||||||
|
├── 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/xlcp
|
||||||
|
git clone <your-repository-url> ./source
|
||||||
|
```
|
||||||
|
|
||||||
|
**方式二:从本地复制**
|
||||||
|
|
||||||
|
在您的开发机器上执行以下命令,将项目复制到服务器:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 复制整个项目到服务器
|
||||||
|
scp -r /Volumes/Dpan/github/xlcp root@192.168.10.150:/work/projects/xlcp/source
|
||||||
|
|
||||||
|
# 或者只复制必要文件
|
||||||
|
scp -r /Volumes/Dpan/github/xlcp/backend root@192.168.10.150:/work/projects/xlcp/
|
||||||
|
scp -r /Volumes/Dpan/github/xlcp/frontend/dist root@192.168.10.150:/work/projects/xlcp/frontend/
|
||||||
|
scp -r /Volumes/Dpan/github/xlcp/backend/sql/mysql/*.sql root@192.168.10.150:/work/projects/xlcp/sql/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 复制配置文件
|
||||||
|
|
||||||
|
将预先准备好的配置文件复制到服务器:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 复制 Docker Compose 配置
|
||||||
|
cp deploy/docker-compose.yml /work/projects/xlcp/
|
||||||
|
|
||||||
|
# 复制后端配置
|
||||||
|
cp deploy/config/application-prod.yaml /work/projects/xlcp/backend/config/
|
||||||
|
|
||||||
|
# 复制后端 Dockerfile
|
||||||
|
cp deploy/docker/backend/Dockerfile /work/projects/xlcp/backend/
|
||||||
|
|
||||||
|
# 复制前端 Nginx 配置
|
||||||
|
cp deploy/docker/frontend/nginx.conf /work/projects/xlcp/frontend/
|
||||||
|
|
||||||
|
# 复制 SQL 初始化脚本
|
||||||
|
cp backend/sql/mysql/*.sql /work/projects/xlcp/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/xlcp/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/xlcp/frontend/
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. 配置文件说明
|
||||||
|
|
||||||
|
### 4.1 Docker Compose 配置
|
||||||
|
|
||||||
|
主要配置项说明:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
# MySQL 数据库服务
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0 # 使用 MySQL 8.0 镜像
|
||||||
|
container_name: xlcp-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: xlcp-redis
|
||||||
|
command: redis-server --requirepass Redis2024!@ # 设置密码
|
||||||
|
volumes:
|
||||||
|
- ./data/redis:/data
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 512M
|
||||||
|
|
||||||
|
# 后端服务
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: ./backend
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: xlcp-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: xlcp-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/xlcp
|
||||||
|
|
||||||
|
# 启动所有服务(后台运行)
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# 查看启动状态
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
|
# 查看服务日志
|
||||||
|
docker compose logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 验证部署
|
||||||
|
|
||||||
|
执行以下命令验证各服务是否正常运行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 检查 MySQL
|
||||||
|
docker exec -it xlcp-mysql mysql -uroot -pPrison2024!@ -e "SHOW DATABASES;"
|
||||||
|
|
||||||
|
# 预期输出应包含 prison 数据库
|
||||||
|
|
||||||
|
# 2. 检查 Redis
|
||||||
|
docker exec -it xlcp-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 xlcp-backend
|
||||||
|
tail -f /work/projects/xlcp/logs/backend/yudao-server.log
|
||||||
|
|
||||||
|
# 查看 Nginx 日志
|
||||||
|
docker logs xlcp-frontend
|
||||||
|
tail -f /work/projects/xlcp/logs/nginx/access.log
|
||||||
|
tail -f /work/projects/xlcp/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 xlcp-backend /bin/sh
|
||||||
|
docker exec -it xlcp-mysql mysql -uroot -pPrison2024!@
|
||||||
|
docker exec -it xlcp-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 xlcp-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 数据备份
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 备份 MySQL 数据库
|
||||||
|
BACKUP_DIR=/work/projects/xlcp/backup
|
||||||
|
mkdir -p $BACKUP_DIR
|
||||||
|
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
|
||||||
|
|
||||||
|
docker exec xlcp-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 xlcp-redis redis-cli -a Redis2024!@ BGSAVE
|
||||||
|
docker cp xlcp-redis:/data/dump.rdb $BACKUP_DIR/redis_$BACKUP_DATE.rdb
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4 版本更新
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 停止当前服务
|
||||||
|
cd /work/projects/xlcp
|
||||||
|
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 xlcp-mysql
|
||||||
|
|
||||||
|
# 检查 MySQL 健康状态
|
||||||
|
docker exec xlcp-mysql mysqladmin -uroot -pPrison2024!@ ping
|
||||||
|
|
||||||
|
# 检查网络连接
|
||||||
|
docker exec xlcp-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 xlcp-backend
|
||||||
|
|
||||||
|
# 检查 Nginx 配置
|
||||||
|
docker exec xlcp-frontend cat /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
# 测试后端连通性
|
||||||
|
docker exec xlcp-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/xlcp/data/
|
||||||
|
|
||||||
|
# 恢复数据(从备份)
|
||||||
|
gunzip -k /work/projects/xlcp/backup/prison_20240115.sql.gz
|
||||||
|
docker exec -i xlcp-mysql mysql -uroot -pPrison2024!@ prison < /work/projects/xlcp/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
|
||||||
2
frontend
2
frontend
@ -1 +1 @@
|
|||||||
Subproject commit 883c5fdb633714c7c49e93324a26d3a2e426ca1b
|
Subproject commit 3b3604073d9623917dcf47a1adaf337b394b6dcd
|
||||||
57
images-archive/upload.sh
Executable file
57
images-archive/upload.sh
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
REMOTE_SERVER="root@192.168.10.150"
|
||||||
|
REMOTE_DIR="/projects/data/xlcp"
|
||||||
|
ARCHIVE_FILE="xlcp-docker-images.tar.gz"
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "上传并加载 Docker 镜像到 192.168.10.150"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
echo "目标服务器: $REMOTE_SERVER"
|
||||||
|
echo "镜像文件: $ARCHIVE_FILE"
|
||||||
|
echo "文件大小: $(du -h $ARCHIVE_FILE | cut -f1)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 创建远程目录
|
||||||
|
echo "[1/4] 创建远程目录..."
|
||||||
|
ssh "$REMOTE_SERVER" "mkdir -p $REMOTE_DIR"
|
||||||
|
echo "✅ 目录创建完成"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 上传镜像
|
||||||
|
echo "[2/4] 上传镜像到远程服务器..."
|
||||||
|
rsync -avz --progress "$ARCHIVE_FILE" "$REMOTE_SERVER:$REMOTE_DIR/"
|
||||||
|
echo ""
|
||||||
|
echo "✅ 上传完成"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 加载镜像
|
||||||
|
echo "[3/4] 在远程服务器加载镜像..."
|
||||||
|
ssh "$REMOTE_SERVER" << ENDSSH
|
||||||
|
cd $REMOTE_DIR
|
||||||
|
echo "解压并加载镜像..."
|
||||||
|
docker load -i "$ARCHIVE_FILE"
|
||||||
|
echo "✅ 镜像加载完成"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "清理镜像文件..."
|
||||||
|
rm "$ARCHIVE_FILE"
|
||||||
|
echo "✅ 清理完成"
|
||||||
|
ENDSSH
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 显示镜像列表
|
||||||
|
echo "[4/4] 显示远程服务器镜像列表..."
|
||||||
|
ssh "$REMOTE_SERVER" "docker images | grep -E 'mysql|redis|nginx|maven|eclipse-temurin|node'"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "========================================="
|
||||||
|
echo "镜像上传和加载完成!"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
echo "下一步操作:"
|
||||||
|
echo " 运行部署脚本: cd .. && ./deploy-to-150.sh"
|
||||||
|
echo ""
|
||||||
Loading…
x
Reference in New Issue
Block a user