#!/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}"