Files
server/deploy.sh
2025-11-01 15:24:04 +08:00

273 lines
6.3 KiB
Bash
Executable File

#!/bin/bash
# 数字档案系统部署脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 项目信息
PROJECT_NAME="digital-archive"
VERSION="latest"
# 检查参数
if [ $# -eq 0 ]; then
echo -e "${RED}用法: $0 <部署目录>${NC}"
echo -e "${YELLOW}示例: $0 /opt/digital-archive${NC}"
exit 1
fi
DEPLOY_DIR=$1
# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
echo -e "${RED}错误: Docker未安装${NC}"
exit 1
fi
# 检查Docker Compose是否安装
if ! docker compose version &> /dev/null && ! command -v docker-compose &> /dev/null; then
echo -e "${RED}错误: Docker Compose未安装${NC}"
exit 1
fi
# 检测Docker Compose命令类型
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
echo -e "${YELLOW}使用命令: ${COMPOSE_CMD}${NC}"
echo -e "${GREEN}开始部署数字档案系统到 ${DEPLOY_DIR}...${NC}"
echo -e "${YELLOW}提示: 可以先运行 ./pre-deploy-check.sh ${DEPLOY_DIR} 进行部署前检查${NC}"
# 检查镜像是否存在
if ! docker images | grep -q ${PROJECT_NAME}; then
echo -e "${RED}错误: 镜像 ${PROJECT_NAME}:${VERSION} 不存在,请先运行 ./build.sh${NC}"
exit 1
fi
# 创建必要的目录
echo -e "${YELLOW}创建部署目录...${NC}"
mkdir -p ${DEPLOY_DIR}/{data/{upload,temp,unzip,images,reports,elasticsearch},logs,nginx}
# 复制配置文件
echo -e "${YELLOW}复制配置文件...${NC}"
cp docker-compose.simple.yml ${DEPLOY_DIR}/docker-compose.yml
# 创建环境配置文件
cat > ${DEPLOY_DIR}/.env << EOF
# 数字档案系统环境配置
COMPOSE_PROJECT_NAME=digital-archive
# 服务配置
SERVER_PORT=9081
SERVER_CONTEXT_PATH=/point-strategy
# MySQL数据库配置
DB_HOST=mysql
DB_PORT=3306
DB_NAME=enterprise_digital_archives
DB_USERNAME=root
DB_PASSWORD=Abc@123456
DB_DRIVER=com.mysql.jdbc.Driver
# Redis配置
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=Abc123456
# Elasticsearch配置
ELASTICSEARCH_URIS=http://elasticsearch:9200
# OCR配置
TESS_PATH=/usr/bin/tesseract
# 其他配置
SWAGGER_SHOW=false
LOG_ROOT_LEVEL=info
LOG_APP_LEVEL=info
JAVA_OPTS=-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
EOF
# 创建nginx配置目录和基础配置
mkdir -p ${DEPLOY_DIR}/nginx/conf.d
cat > ${DEPLOY_DIR}/nginx/nginx.conf << 'EOF'
events {
worker_connections 1024;
}
http {
upstream app {
server app:9081;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
EOF
# 设置目录权限
echo -e "${YELLOW}设置目录权限...${NC}"
chmod -R 755 ${DEPLOY_DIR}/data/
chmod -R 755 ${DEPLOY_DIR}/logs/
chmod 644 ${DEPLOY_DIR}/.env
chmod 644 ${DEPLOY_DIR}/docker-compose.yml
# 创建启动脚本
cat > ${DEPLOY_DIR}/start.sh << 'EOF'
#!/bin/bash
# 启动数字档案系统
echo "启动数字档案系统..."
# 检测Docker Compose命令类型
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
${COMPOSE_CMD} up -d
echo "等待服务启动..."
sleep 30
echo "检查服务状态..."
${COMPOSE_CMD} ps
echo "查看应用日志..."
${COMPOSE_CMD} logs -f app
EOF
# 创建停止脚本
cat > ${DEPLOY_DIR}/stop.sh << 'EOF'
#!/bin/bash
# 停止数字档案系统
echo "停止数字档案系统..."
# 检测Docker Compose命令类型
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
${COMPOSE_CMD} down
echo "清理未使用的镜像和容器..."
docker system prune -f
EOF
# 创建更新脚本
cat > ${DEPLOY_DIR}/update.sh << 'EOF'
#!/bin/bash
# 更新数字档案系统
echo "更新数字档案系统..."
# 检测Docker Compose命令类型
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
echo "停止服务..."
${COMPOSE_CMD} down
echo "拉取最新镜像..."
${COMPOSE_CMD} pull
echo "启动服务..."
${COMPOSE_CMD} up -d
echo "清理旧镜像..."
docker image prune -f
EOF
# 设置脚本执行权限
chmod +x ${DEPLOY_DIR}/start.sh
chmod +x ${DEPLOY_DIR}/stop.sh
chmod +x ${DEPLOY_DIR}/update.sh
# 创建生产环境docker-compose文件
cat > ${DEPLOY_DIR}/docker-compose.prod.yml << 'EOF'
version: '3.8'
services:
app:
image: digital-archive:latest
container_name: digital-archive-app
ports:
- "9081:9081"
volumes:
- ./data/upload:/app/data/upload
- ./data/temp:/app/data/temp
- ./data/unzip:/app/data/unzip
- ./data/images:/app/data/images
- ./data/reports:/app/data/reports
- ./logs:/app/logs
env_file:
- .env
depends_on:
- elasticsearch
networks:
- proxy
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9081/point-strategy/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
elasticsearch:
image: elasticsearch:7.17.0
container_name: digital-archive-elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
volumes:
- ./data/elasticsearch:/usr/share/elasticsearch/data
networks:
- proxy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
proxy:
external: true
EOF
echo -e "${GREEN}部署完成!${NC}"
echo -e "${YELLOW}部署目录: ${DEPLOY_DIR}${NC}"
echo -e "${YELLOW}可用命令:${NC}"
echo " 启动服务: cd ${DEPLOY_DIR} && ./start.sh"
echo " 停止服务: cd ${DEPLOY_DIR} && ./stop.sh"
echo " 更新服务: cd ${DEPLOY_DIR} && ./update.sh"
echo " 查看状态: cd ${DEPLOY_DIR} && ./start.sh 或 docker-compose ps"
echo " 查看日志: cd ${DEPLOY_DIR} && docker-compose logs -f app"
echo ""
echo -e "${YELLOW}访问地址: http://localhost:9081/point-strategy${NC}"