#!/bin/bash # 初始化部署脚本 - 在云端服务器上生成部署文件并拉取代码 # 部署目录 deploy_dir="/opt/project_web" mkdir -p "$deploy_dir" cd "$deploy_dir" echo "开始在云端服务器初始化部署环境..." # 1. 创建Dockerfile echo "创建Dockerfile..." cat > Dockerfile << 'EOF' # 使用官方Tomcat 10.1作为基础镜像,兼容Spring Boot 3.x和Java 17 FROM tomcat:10.1-jdk17-openjdk # 维护者信息 LABEL maintainer="your-email@example.com" # 删除Tomcat默认的ROOT应用 RUN rm -rf /usr/local/tomcat/webapps/ROOT # 将构建好的WAR文件复制到Tomcat的webapps目录下,并命名为KH.war,与配置文件中的上下文路径一致 COPY web.war /usr/local/tomcat/webapps/KH.war # 暴露Tomcat端口,与application.yaml中的端口一致 EXPOSE 8083 # 启动Tomcat服务 CMD ["catalina.sh", "run"] EOF # 2. 创建docker-compose.yml echo "创建docker-compose.yml..." cat > docker-compose.yml << 'EOF' services: tomcat-app: image: web:latest ports: - "8083:8080" environment: - SPRING_DATASOURCE_PRIMARY_JDBC_URL=jdbc:mysql://1.95.162.61:3306/userlogin?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_PRIMARY_USERNAME=root - SPRING_DATASOURCE_PRIMARY_PASSWORD=schl@2025 - SPRING_DATASOURCE_WECHAT_JDBC_URL=jdbc:mysql://1.95.162.61:3306/wechat_app?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_WECHAT_USERNAME=root - SPRING_DATASOURCE_WECHAT_PASSWORD=schl@2025 - SERVER_SERVLET_CONTEXT_PATH=/KH restart: always container_name: followweb logging: driver: "json-file" options: max-size: "50m" max-file: "3" EOF # 3. 创建deploy.sh echo "创建deploy.sh..." cat > deploy.sh << 'EOF' #!/bin/bash # 修复后的部署脚本 - 解决Maven构建找不到pom.xml的问题 # 配置信息 GIT_REPO="http://8.137.125.67:4000/SwtTt29/web-follow.git" BRANCH="KH" PROJECT_NAME="web" DOCKER_IMAGE="web" CONTAINER_NAME="followweb" PORT="8083" # 颜色定义 GREEN="\033[0;32m" RED="\033[0;31m" YELLOW="\033[1;33m" NC="\033[0m" # No Color echo -e "${YELLOW}开始部署应用...${NC}" # 1. 检查Git是否安装 if ! command -v git &> /dev/null; then echo -e "${RED}错误: Git未安装,请先安装Git${NC}" exit 1 fi # 2. 检查Docker是否安装 if ! command -v docker &> /dev/null; then echo -e "${RED}错误: Docker未安装,请先安装Docker${NC}" exit 1 fi # 3. 检查Docker Compose是否安装 if ! command -v docker-compose &> /dev/null; then echo -e "${RED}错误: Docker Compose未安装,请先安装Docker Compose${NC}" exit 1 fi # 4. 拉取或更新代码 echo -e "${GREEN}1. 拉取/更新代码...${NC}" if [ -d "$PROJECT_NAME" ]; then cd "$PROJECT_NAME" git pull origin "$BRANCH" if [ $? -ne 0 ]; then echo -e "${RED}错误: Git拉取失败${NC}" exit 1 fi else git clone "$GIT_REPO" "$PROJECT_NAME" if [ $? -ne 0 ]; then echo -e "${RED}错误: Git克隆失败${NC}" exit 1 fi cd "$PROJECT_NAME" fi # 5. 查找pom.xml文件,确定正确的构建目录 echo -e "${GREEN}2. 查找pom.xml文件...${NC}" pom_path=$(find . -name "pom.xml" -type f | head -1) if [ -z "$pom_path" ]; then echo -e "${RED}错误: 未找到pom.xml文件,请检查Git仓库结构${NC}" exit 1 fi # 获取pom.xml所在目录 maven_dir=$(dirname "$pom_path") echo -e "${GREEN}3. 在目录 $maven_dir 中构建项目...${NC}" # 6. 构建项目 cd "$maven_dir" mvn clean package -DskipTests if [ $? -ne 0 ]; then echo -e "${RED}错误: Maven构建失败${NC}" exit 1 fi # 7. 查找生成的WAR文件(使用original版本,避免Spring Boot嵌入式Tomcat与外部Tomcat冲突) war_path=$(find . -name "*.war.original" -type f | head -1) # 如果没有找到original版本,使用普通WAR文件 if [ -z "$war_path" ]; then war_path=$(find . -name "*.war" -type f | head -1) fi if [ -z "$war_path" ]; then echo -e "${RED}错误: 未找到生成的WAR文件,请检查Maven构建结果${NC}" exit 1 fi # 8. 获取绝对路径的WAR文件路径 if [[ "$war_path" != /* ]]; then war_path="$(pwd)/$war_path" fi # 9. 返回项目根目录(当前在maven_dir,需要返回到/opt/project_web目录) cd /opt/project_web # 9. 复制WAR文件到web子目录下,供Dockerfile使用 cp "$war_path" ./web/web.war echo -e "${GREEN}4. 停止并移除旧容器...${NC}" # 确保旧容器被完全移除,即使docker-compose down失败 old_container=$(docker ps -a -q -f name=followweb) if [ ! -z "$old_container" ]; then echo -e "${GREEN} 停止旧容器...${NC}" docker stop "$old_container" > /dev/null 2>&1 echo -e "${GREEN} 移除旧容器...${NC}" docker rm "$old_container" > /dev/null 2>&1 fi # 使用docker-compose down确保所有相关资源都被清理 docker-compose down 2>/dev/null || true # 10. 构建新的Docker镜像 echo -e "${GREEN}5. 构建Docker镜像...${NC}" docker build -t web:latest ./web if [ $? -ne 0 ]; then echo -e "${RED}错误: Docker构建失败${NC}" exit 1 fi # 11. 启动新容器 echo -e "${GREEN}6. 启动新容器...${NC}" docker-compose up -d if [ $? -ne 0 ]; then echo -e "${RED}错误: Docker容器启动失败${NC}" exit 1 fi # 12. 检查容器状态 echo -e "${GREEN}7. 检查容器状态...${NC}" sleep 5 # 等待容器完全启动 docker ps -a | grep followweb if [ $? -ne 0 ]; then echo -e "${RED}错误: 容器未找到,请检查启动日志${NC}" docker-compose logs exit 1 fi # 13. 查看容器日志 echo -e "${GREEN}8. 查看容器启动日志...${NC}" docker logs followweb --tail 100 # 14. 检查应用健康状态 echo -e "${GREEN}9. 检查应用健康状态...${NC}" sleep 10 # 等待应用完全启动 # 尝试访问应用的健康检查端点 response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8083/KH) if [ "$response" -eq 200 ] || [ "$response" -eq 302 ]; then echo -e "${GREEN}应用健康检查通过,HTTP状态码: $response${NC}" else echo -e "${YELLOW}应用健康检查失败,HTTP状态码: $response${NC}" echo -e "${YELLOW}尝试访问根路径...${NC}" curl -s http://localhost:8083/KH || echo "无法访问应用根路径" fi # 15. 检查容器内部进程 echo -e "${GREEN}10. 检查容器内部进程...${NC}" docker exec -it followweb ps aux | grep java # 16. 检查Tomcat日志 echo -e "${GREEN}11. 检查Tomcat日志...${NC}" docker exec -it followweb tail -n 100 /usr/local/tomcat/logs/catalina.out # 17. 检查Spring Boot应用日志 echo -e "${GREEN}12. 检查Spring Boot应用日志...${NC}" docker exec -it followweb find /usr/local/tomcat/webapps/KH -name "*.log" -type f | xargs -l1 echo "找到日志文件: {}" # 18. 检查应用部署状态 echo -e "${GREEN}13. 检查应用部署状态...${NC}" docker exec -it followweb ls -la /usr/local/tomcat/webapps/ echo -e "${GREEN}14. 检查应用目录结构...${NC}" docker exec -it followweb ls -la /usr/local/tomcat/webapps/KH/ # 19. 检查Tomcat端口配置 echo -e "${GREEN}15. 检查Tomcat端口配置...${NC}" docker exec -it followweb cat /usr/local/tomcat/conf/server.xml | grep -A 5 -B 5 "Connector" # 20. 检查防火墙设置 echo -e "${GREEN}16. 检查防火墙设置...${NC}" sudo firewall-cmd --list-ports || echo "无法检查防火墙设置" # 12. 清理临时WAR文件 rm -f ./web/web.war # 13. 设置日志自动清理任务 echo -e "${GREEN}7. 设置日志自动清理任务...${NC}" # 创建日志清理脚本 cat > /opt/project_web/cleanup_logs.sh << 'CLEANUP_EOF' #!/bin/bash # 清理Docker容器日志 container_name="followweb" # 检查容器是否存在 if docker ps -a --format '{{.Names}}' | grep -q "^$container_name$"; then # 清理容器日志 docker logs $container_name > /dev/null 2>&1 echo "日志清理完成: $(date)" else echo "容器 $container_name 不存在,跳过日志清理" fi # 检查日志大小,超过50MB立即清理 log_size=$(docker inspect --format '{{.LogPath}}' $container_name 2>/dev/null) if [ -n "$log_size" ] && [ -f "$log_size" ]; then current_size=$(du -m "$log_size" 2>/dev/null | cut -f1) if [ "$current_size" -gt 50 ]; then echo "日志大小超过50MB ($current_size MB),立即清理" docker logs $container_name > /dev/null 2>&1 echo "日志清理完成: $(date)" fi fi CLEANUP_EOF # 设置脚本执行权限 chmod +x /opt/project_web/cleanup_logs.sh # 设置cron任务,每三天执行一次 (crontab -l 2>/dev/null | grep -v "cleanup_logs.sh"; echo "0 0 */3 * * /opt/project_web/cleanup_logs.sh >> /opt/project_web/cleanup.log 2>&1") | crontab - if [ $? -eq 0 ]; then echo -e "${GREEN}日志自动清理任务已设置,每三天执行一次${NC}" else echo -e "${YELLOW}警告: 无法设置cron任务,请手动添加${NC}" echo -e "${YELLOW}手动添加命令: (crontab -l 2>/dev/null | grep -v \"cleanup_logs.sh\"; echo \"0 0 */3 * * /opt/project_web/cleanup_logs.sh >> /opt/project_web/cleanup.log 2>&1\") | crontab -${NC}" fi echo -e "${GREEN}部署完成!${NC}" echo -e "${YELLOW}应用访问地址: http://8.137.125.67:${PORT}/KH${NC}" echo -e "${YELLOW}容器名称: ${CONTAINER_NAME}${NC}" echo -e "${YELLOW}查看日志命令: docker logs -f ${CONTAINER_NAME}${NC}" echo -e "${YELLOW}日志清理脚本: /opt/project_web/cleanup_logs.sh${NC}" echo -e "${YELLOW}日志清理日志: /opt/project_web/cleanup.log${NC}" EOF # 4. 设置脚本执行权限 echo "设置脚本执行权限..." chmod +x deploy.sh # 5. 拉取Git代码 echo "拉取Git代码..." git clone http://8.137.125.67:4000/SwtTt29/web-follow.git web # 6. 将Dockerfile复制到web目录 cp Dockerfile web/ echo "初始化完成!" echo "部署文件已生成在: $deploy_dir" echo "Git代码已拉取到: $deploy_dir/web" echo "可以通过以下命令执行部署:" echo " cd $deploy_dir" echo " ./deploy.sh"