392 lines
9.0 KiB
Bash
Executable File
392 lines
9.0 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# DMS合规性测试工具 - Docker镜像打包脚本
|
||
# 用于创建离线部署包
|
||
|
||
set -e
|
||
|
||
# 配置变量
|
||
EXPORT_DIR="dms-compliance-offline"
|
||
IMAGE_NAME="compliance-dms-compliance-tool"
|
||
NGINX_IMAGE="nginx:alpine"
|
||
ARCHIVE_NAME="dms-compliance-offline-$(date +%Y%m%d-%H%M%S).tar.gz"
|
||
|
||
echo "=== DMS合规性测试工具 离线部署包创建脚本 ==="
|
||
|
||
# 检查Docker是否运行
|
||
if ! docker info >/dev/null 2>&1; then
|
||
echo "[错误] Docker未运行或无法访问"
|
||
exit 1
|
||
fi
|
||
|
||
# 创建导出目录
|
||
echo "[信息] 创建导出目录: $EXPORT_DIR"
|
||
rm -rf "$EXPORT_DIR"
|
||
mkdir -p "$EXPORT_DIR"
|
||
|
||
# 1. 构建最新镜像
|
||
echo "[信息] 构建DMS合规性测试工具镜像..."
|
||
docker-compose build dms-compliance-tool
|
||
|
||
# 2. 导出主应用镜像
|
||
echo "[信息] 导出主应用镜像..."
|
||
docker save "$IMAGE_NAME:latest" -o "$EXPORT_DIR/dms-compliance-tool.tar"
|
||
|
||
# 3. 拉取并导出nginx镜像(如果需要)
|
||
echo "[信息] 拉取并导出nginx镜像..."
|
||
docker pull "$NGINX_IMAGE"
|
||
docker save "$NGINX_IMAGE" -o "$EXPORT_DIR/nginx-alpine.tar"
|
||
|
||
# 4. 复制部署文件
|
||
echo "[信息] 复制部署文件..."
|
||
|
||
# 创建离线版docker-compose文件
|
||
cat > "$EXPORT_DIR/docker-compose.yml" << 'EOF'
|
||
version: '3.8'
|
||
|
||
services:
|
||
dms-compliance-tool:
|
||
image: compliance-dms-compliance-tool:latest
|
||
container_name: dms-compliance-tool
|
||
ports:
|
||
- "5050:5050" # API服务器端口
|
||
- "5051:5051" # 历史查看器端口
|
||
volumes:
|
||
# 持久化测试报告
|
||
- ./data/test_reports:/app/test_reports
|
||
# 持久化上传文件
|
||
- ./data/uploads:/app/uploads
|
||
# 持久化日志
|
||
- ./data/logs:/app/logs
|
||
# 如果需要自定义配置文件
|
||
- ./config:/app/config:ro
|
||
environment:
|
||
- FLASK_ENV=production
|
||
- PYTHONUNBUFFERED=1
|
||
- TZ=Asia/Shanghai
|
||
restart: unless-stopped
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-f", "http://localhost:5050/"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
start_period: 40s
|
||
networks:
|
||
- dms-network
|
||
|
||
# 可选:添加一个nginx反向代理
|
||
nginx:
|
||
image: nginx:alpine
|
||
container_name: dms-nginx
|
||
ports:
|
||
- "80:80"
|
||
- "443:443"
|
||
volumes:
|
||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
||
- ./nginx/ssl:/etc/nginx/ssl:ro
|
||
depends_on:
|
||
- dms-compliance-tool
|
||
restart: unless-stopped
|
||
networks:
|
||
- dms-network
|
||
profiles:
|
||
- with-nginx
|
||
|
||
networks:
|
||
dms-network:
|
||
driver: bridge
|
||
|
||
volumes:
|
||
test_reports:
|
||
uploads:
|
||
logs:
|
||
EOF
|
||
|
||
# 5. 复制nginx配置(如果存在)
|
||
if [ -d "nginx" ]; then
|
||
echo "[信息] 复制nginx配置..."
|
||
cp -r nginx "$EXPORT_DIR/"
|
||
fi
|
||
|
||
# 6. 复制config目录(如果存在)
|
||
if [ -d "config" ]; then
|
||
echo "[信息] 复制配置文件..."
|
||
cp -r config "$EXPORT_DIR/"
|
||
fi
|
||
|
||
# 7. 创建数据目录结构
|
||
echo "[信息] 创建数据目录结构..."
|
||
mkdir -p "$EXPORT_DIR/data/test_reports"
|
||
mkdir -p "$EXPORT_DIR/data/uploads"
|
||
mkdir -p "$EXPORT_DIR/data/logs"
|
||
|
||
# 8. 复制现有的测试报告(如果存在)
|
||
if [ -d "test_reports" ] && [ "$(ls -A test_reports)" ]; then
|
||
echo "[信息] 复制现有测试报告..."
|
||
cp -r test_reports/* "$EXPORT_DIR/data/test_reports/"
|
||
fi
|
||
|
||
# 9. 创建部署脚本
|
||
echo "[信息] 创建部署脚本..."
|
||
|
||
cat > "$EXPORT_DIR/deploy.sh" << 'EOF'
|
||
#!/bin/bash
|
||
|
||
# DMS合规性测试工具 - 离线部署脚本
|
||
|
||
set -e
|
||
|
||
echo "=== DMS合规性测试工具 离线部署脚本 ==="
|
||
|
||
# 检查Docker是否运行
|
||
if ! docker info >/dev/null 2>&1; then
|
||
echo "[错误] Docker未运行或无法访问,请先安装并启动Docker"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查docker-compose是否可用
|
||
if ! command -v docker-compose >/dev/null 2>&1; then
|
||
echo "[错误] docker-compose未安装,请先安装docker-compose"
|
||
exit 1
|
||
fi
|
||
|
||
echo "[信息] 加载Docker镜像..."
|
||
|
||
# 加载主应用镜像
|
||
if [ -f "dms-compliance-tool.tar" ]; then
|
||
echo "[信息] 加载DMS合规性测试工具镜像..."
|
||
docker load -i dms-compliance-tool.tar
|
||
else
|
||
echo "[错误] 找不到dms-compliance-tool.tar镜像文件"
|
||
exit 1
|
||
fi
|
||
|
||
# 加载nginx镜像
|
||
if [ -f "nginx-alpine.tar" ]; then
|
||
echo "[信息] 加载nginx镜像..."
|
||
docker load -i nginx-alpine.tar
|
||
else
|
||
echo "[警告] 找不到nginx-alpine.tar镜像文件,nginx服务将无法使用"
|
||
fi
|
||
|
||
echo "[信息] 创建必要的目录..."
|
||
mkdir -p data/test_reports data/uploads data/logs
|
||
|
||
echo "[信息] 设置目录权限..."
|
||
# 确保目录权限正确(Docker容器中的用户ID可能不同)
|
||
chmod -R 755 data/
|
||
|
||
echo "[信息] 启动服务..."
|
||
docker-compose up -d
|
||
|
||
echo "[信息] 等待服务启动..."
|
||
sleep 10
|
||
|
||
# 检查服务状态
|
||
echo "[信息] 检查服务状态..."
|
||
docker-compose ps
|
||
|
||
# 检查健康状态
|
||
echo "[信息] 检查服务健康状态..."
|
||
for i in {1..30}; do
|
||
if curl -f http://localhost:5050/ >/dev/null 2>&1; then
|
||
echo "[成功] API服务器已启动并正常运行"
|
||
break
|
||
fi
|
||
if [ $i -eq 30 ]; then
|
||
echo "[警告] API服务器健康检查超时,请检查日志"
|
||
docker-compose logs dms-compliance-tool
|
||
fi
|
||
sleep 2
|
||
done
|
||
|
||
if curl -f http://localhost:5051/ >/dev/null 2>&1; then
|
||
echo "[成功] 历史查看器已启动并正常运行"
|
||
else
|
||
echo "[警告] 历史查看器可能未正常启动,请检查日志"
|
||
fi
|
||
|
||
echo ""
|
||
echo "=== 部署完成 ==="
|
||
echo "API服务器地址: http://localhost:5050"
|
||
echo "历史查看器地址: http://localhost:5051"
|
||
echo ""
|
||
echo "常用命令:"
|
||
echo " 查看服务状态: docker-compose ps"
|
||
echo " 查看日志: docker-compose logs"
|
||
echo " 停止服务: docker-compose down"
|
||
echo " 重启服务: docker-compose restart"
|
||
echo ""
|
||
EOF
|
||
|
||
chmod +x "$EXPORT_DIR/deploy.sh"
|
||
|
||
# 10. 创建停止脚本
|
||
cat > "$EXPORT_DIR/stop.sh" << 'EOF'
|
||
#!/bin/bash
|
||
|
||
# DMS合规性测试工具 - 停止脚本
|
||
|
||
echo "=== 停止DMS合规性测试工具 ==="
|
||
|
||
if [ -f "docker-compose.yml" ]; then
|
||
docker-compose down
|
||
echo "[信息] 服务已停止"
|
||
else
|
||
echo "[错误] 找不到docker-compose.yml文件"
|
||
exit 1
|
||
fi
|
||
EOF
|
||
|
||
chmod +x "$EXPORT_DIR/stop.sh"
|
||
|
||
# 11. 创建卸载脚本
|
||
cat > "$EXPORT_DIR/uninstall.sh" << 'EOF'
|
||
#!/bin/bash
|
||
|
||
# DMS合规性测试工具 - 卸载脚本
|
||
|
||
echo "=== 卸载DMS合规性测试工具 ==="
|
||
|
||
read -p "确定要卸载DMS合规性测试工具吗?这将删除所有容器和镜像 (y/N): " confirm
|
||
|
||
if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then
|
||
echo "[信息] 停止并删除容器..."
|
||
docker-compose down -v
|
||
|
||
echo "[信息] 删除镜像..."
|
||
docker rmi compliance-dms-compliance-tool:latest nginx:alpine 2>/dev/null || true
|
||
|
||
echo "[信息] 清理未使用的资源..."
|
||
docker system prune -f
|
||
|
||
echo "[成功] 卸载完成"
|
||
else
|
||
echo "[信息] 取消卸载"
|
||
fi
|
||
EOF
|
||
|
||
chmod +x "$EXPORT_DIR/uninstall.sh"
|
||
|
||
# 12. 创建README文件
|
||
cat > "$EXPORT_DIR/README.md" << 'EOF'
|
||
# DMS合规性测试工具 - 离线部署包
|
||
|
||
## 系统要求
|
||
|
||
- Docker 20.10+
|
||
- Docker Compose 1.29+
|
||
- 至少2GB可用内存
|
||
- 至少5GB可用磁盘空间
|
||
|
||
## 快速部署
|
||
|
||
1. 解压部署包到目标目录
|
||
2. 进入部署目录
|
||
3. 运行部署脚本:
|
||
```bash
|
||
./deploy.sh
|
||
```
|
||
|
||
## 服务访问
|
||
|
||
部署成功后,可以通过以下地址访问服务:
|
||
|
||
- **API服务器**: http://localhost:5050
|
||
- **历史查看器**: http://localhost:5051
|
||
|
||
## 常用操作
|
||
|
||
### 查看服务状态
|
||
```bash
|
||
docker-compose ps
|
||
```
|
||
|
||
### 查看服务日志
|
||
```bash
|
||
# 查看所有服务日志
|
||
docker-compose logs
|
||
|
||
# 查看特定服务日志
|
||
docker-compose logs dms-compliance-tool
|
||
```
|
||
|
||
### 停止服务
|
||
```bash
|
||
./stop.sh
|
||
# 或者
|
||
docker-compose down
|
||
```
|
||
|
||
### 重启服务
|
||
```bash
|
||
docker-compose restart
|
||
```
|
||
|
||
### 完全卸载
|
||
```bash
|
||
./uninstall.sh
|
||
```
|
||
|
||
## 数据持久化
|
||
|
||
以下目录的数据会被持久化保存:
|
||
|
||
- `data/test_reports/` - 测试报告
|
||
- `data/uploads/` - 上传的文件
|
||
- `data/logs/` - 应用日志
|
||
|
||
## 配置文件
|
||
|
||
如需自定义配置,可以在 `config/` 目录中放置配置文件。
|
||
|
||
## 故障排除
|
||
|
||
### 端口冲突
|
||
如果5050或5051端口被占用,可以修改 `docker-compose.yml` 文件中的端口映射。
|
||
|
||
### 权限问题
|
||
如果遇到权限问题,可以尝试:
|
||
```bash
|
||
sudo chown -R $USER:$USER data/
|
||
chmod -R 755 data/
|
||
```
|
||
|
||
### 服务无法启动
|
||
1. 检查Docker是否正常运行
|
||
2. 查看服务日志:`docker-compose logs`
|
||
3. 检查系统资源是否充足
|
||
|
||
## 技术支持
|
||
|
||
如遇到问题,请提供以下信息:
|
||
- 操作系统版本
|
||
- Docker版本
|
||
- 错误日志
|
||
- 服务状态输出
|
||
EOF
|
||
|
||
# 13. 创建版本信息文件
|
||
cat > "$EXPORT_DIR/VERSION" << EOF
|
||
DMS合规性测试工具 离线部署包
|
||
构建时间: $(date '+%Y-%m-%d %H:%M:%S')
|
||
构建主机: $(hostname)
|
||
Docker版本: $(docker --version)
|
||
Docker Compose版本: $(docker-compose --version)
|
||
EOF
|
||
|
||
echo "[信息] 压缩部署包..."
|
||
tar -czf "$ARCHIVE_NAME" "$EXPORT_DIR"
|
||
|
||
echo ""
|
||
echo "=== 打包完成 ==="
|
||
echo "部署包: $ARCHIVE_NAME"
|
||
echo "大小: $(du -h "$ARCHIVE_NAME" | cut -f1)"
|
||
echo ""
|
||
echo "部署说明:"
|
||
echo "1. 将 $ARCHIVE_NAME 传输到目标服务器"
|
||
echo "2. 解压: tar -xzf $ARCHIVE_NAME"
|
||
echo "3. 进入目录: cd $EXPORT_DIR"
|
||
echo "4. 运行部署: ./deploy.sh"
|
||
echo ""
|