You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

254 lines
6.7 KiB

#!/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 # 日志清理脚本"