#!/bin/bash # 初始化部署脚本 - 在云端服务器上生成部署文件并拉取代码 # 部署目录 deploy_dir="/opt/project_web_Admi-Panel" mkdir -p "$deploy_dir" cd "$deploy_dir" # 清理目录中的所有文件(如果存在) echo "清理部署目录..." rm -rf * echo "开始在云端服务器初始化部署环境..." # 确保脚本有执行权限 chmod +x "$0" # 1. 创建仓名目录 repo_dir="admin-panel" mkdir -p "$repo_dir" # 2. 创建logs目录 mkdir -p logs # 3. 创建Dockerfile echo "创建Dockerfile..." cat > Dockerfile << 'EOF' # 使用官方Node.js 18作为基础镜像 FROM node:18-alpine # 维护者信息 LABEL maintainer="your-email@example.com" # 设置工作目录 WORKDIR /app # 复制package.json和package-lock.json COPY package*.json ./ # 安装依赖 RUN npm install --production # 复制应用代码 COPY . . # 暴露端口 EXPOSE 3005 # 启动应用 CMD ["node", "server.js"] EOF # 4. 创建docker-compose.yml echo "创建docker-compose.yml..." cat > docker-compose.yml << 'EOF' services: node-app: image: admin-panel:latest ports: - "3005:3005" environment: - NODE_ENV=production restart: always container_name: admin-panel logging: driver: "json-file" options: max-size: "50m" max-file: "3" volumes: - ./logs:/app/logs EOF # 5. 创建deploy.sh echo "创建deploy.sh..." cat > deploy.sh << 'EOF' #!/bin/bash # 部署脚本 - 部署后台管理系统 # 配置信息 GIT_REPO="http://8.137.125.67:4000/SwtTt29/Admi-Panel.git" BRANCH="master" PROJECT_NAME="admin-panel" DOCKER_IMAGE="admin-panel" CONTAINER_NAME="admin-panel" PORT="3005" # 颜色定义 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. 返回项目根目录 cd /opt/project_web_Admi-Panel # 6. 构建新的Docker镜像 echo -e "${GREEN}2. 构建Docker镜像...${NC}" docker build -t admin-panel:latest ./admin-panel if [ $? -ne 0 ]; then echo -e "${RED}错误: Docker构建失败${NC}" exit 1 fi # 7. 停止并移除旧容器 echo -e "${GREEN}3. 停止并移除旧容器...${NC}" # 确保旧容器被完全移除,即使docker-compose down失败 old_container=$(docker ps -a -q -f name=admin-panel) 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 # 8. 启动新容器 echo -e "${GREEN}4. 启动新容器...${NC}" docker-compose up -d if [ $? -ne 0 ]; then echo -e "${RED}错误: Docker容器启动失败${NC}" exit 1 fi # 9. 设置日志自动清理任务 echo -e "${GREEN}5. 设置日志自动清理任务...${NC}" # 创建日志清理脚本 cat > cleanup_logs.sh << 'CLEANUP_EOF' #!/bin/bash # 清理Docker容器日志 container_name="admin-panel" # 检查容器是否存在 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 # 清理logs目录中超过30天的文件 find ./logs -type f -mtime +30 -delete if [ $? -eq 0 ]; then echo "logs目录清理完成: $(date)" else echo "logs目录清理失败: $(date)" 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 cleanup_logs.sh # 设置cron任务,每三天执行一次 (crontab -l 2>/dev/null | grep -v "cleanup_logs.sh"; echo "0 0 */3 * * $deploy_dir/cleanup_logs.sh >> $deploy_dir/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 * * $deploy_dir/cleanup_logs.sh >> $deploy_dir/cleanup.log 2>&1\") | crontab -${NC}" fi echo -e "${GREEN}部署完成!${NC}" echo -e "${YELLOW}应用访问地址: http://8.137.125.67:${PORT}${NC}" echo -e "${YELLOW}容器名称: ${CONTAINER_NAME}${NC}" echo -e "${YELLOW}查看日志命令: docker logs -f ${CONTAINER_NAME}${NC}" echo -e "${YELLOW}日志清理脚本: $deploy_dir/cleanup_logs.sh${NC}" echo -e "${YELLOW}日志清理日志: $deploy_dir/cleanup.log${NC}" EOF # 6. 设置脚本执行权限 echo "设置脚本执行权限..." chmod +x deploy.sh # 7. 拉取Git代码 echo "拉取Git代码..." git clone http://8.137.125.67:4000/SwtTt29/Admi-Panel.git "$repo_dir" # 8. 复制配置文件到仓名目录 cp Dockerfile "$repo_dir/" cp docker-compose.yml "$repo_dir/" echo "初始化完成!" echo "部署文件已生成在: $deploy_dir" echo "Git代码已拉取到: $deploy_dir/$repo_dir" echo "可以通过以下命令执行部署:" echo " cd $deploy_dir" echo " ./deploy.sh" echo "" echo "部署后目录结构:" echo "$deploy_dir/" echo "├── $repo_dir/ # 仓名目录,包含应用代码" echo "├── logs/ # 日志目录" echo "├── Dockerfile # Docker配置文件" echo "├── docker-compose.yml # Docker Compose配置文件" echo "├── deploy.sh # 部署脚本" echo "└── cleanup_logs.sh # 日志清理脚本"