#!/bin/bash # 部署脚本 - 微信小程序后端服务 echo "开始部署微信小程序后端服务..." # 检查是否安装了Docker echo "检查Docker是否安装..." if ! command -v docker &> /dev/null; then echo "错误: Docker未安装,请先安装Docker" exit 1 fi # 配置Docker国内镜像源加速 echo "配置Docker国内镜像源加速..." mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": [ "https://registry.cn-hangzhou.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "https://mirror.baidubce.com", "https://hub-mirror.c.163.com", "https://reg-mirror.qiniu.com" ] } EOF # 重启Docker服务使配置生效 systemctl daemon-reload 2>/dev/null || true systemctl restart docker 2>/dev/null || true sleep 5 # 检查并更新Docker Compose和Buildx echo "检查并更新Docker工具..." # 检查是否安装了Docker Compose if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then echo "Docker Compose未安装,正在安装..." # 使用Daocloud镜像加速安装 curl -L "https://get.daocloud.io/docker/compose/releases/download/latest/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose fi # 安装或更新Docker Buildx echo "检查并安装Docker Buildx..." # 检查Buildx是否已安装 if ! docker buildx version &> /dev/null; then echo "Buildx未安装,正在安装..." # 1. 获取系统架构 ARCH=$(uname -m) if [ "$ARCH" = "x86_64" ]; then BUILDX_ARCH="amd64" elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then BUILDX_ARCH="arm64" else echo "错误: 不支持的系统架构 $ARCH" echo "将直接使用docker build替代docker-compose build..." export USE_ALTERNATE_BUILD="true" fi if [ -z "$USE_ALTERNATE_BUILD" ]; then # 2. 下载最新版本的Buildx BUILDX_VERSION=$(curl -s https://api.github.com/repos/docker/buildx/releases/latest | grep -o '"tag_name": "v[^"]*"' | sed 's/"tag_name": "v//' | sed 's/"//') echo "正在下载Buildx版本 $BUILDX_VERSION ($BUILDX_ARCH)..." # 3. 创建插件目录 mkdir -p ~/.docker/cli-plugins # 4. 下载并安装Buildx curl -L "https://github.com/docker/buildx/releases/download/v$BUILDX_VERSION/buildx-v$BUILDX_VERSION.linux-$BUILDX_ARCH" -o ~/.docker/cli-plugins/docker-buildx # 5. 添加执行权限 chmod +x ~/.docker/cli-plugins/docker-buildx # 6. 验证安装 if docker buildx version &> /dev/null; then echo "Buildx安装成功!" else echo "警告: Buildx安装失败,将直接使用docker build替代docker-compose build..." export USE_ALTERNATE_BUILD="true" fi fi else # Buildx已安装,检查版本 buildx_version=$(docker buildx version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+' | head -1 || echo "0.0") echo "当前Buildx版本: $buildx_version" if [[ "$buildx_version" < "0.17" ]]; then echo "Buildx版本低于0.17,将直接使用docker build替代docker-compose build..." export USE_ALTERNATE_BUILD="true" fi fi if [[ "$USE_ALTERNATE_BUILD" == "true" ]]; then echo "将使用docker build直接构建镜像..." fi echo "Docker工具检查完成" # 创建项目目录 echo "创建项目目录..." mkdir -p /opt/project_app/logs /opt/project_app/uploads /opt/project_app/mysql-data # 处理代码仓库或更新代码 echo "处理代码仓库..." REPO_URL="http://8.137.125.67:4000/Swt29/Project_app.git" BRANCH="BOSS" # 测试仓库连接 if ! git ls-remote $REPO_URL &> /dev/null; then echo "警告: 无法连接到Gitea仓库 $REPO_URL (端口4000拒绝连接)" echo "请检查网络连接和仓库地址是否正确" echo "如果仓库不可用,将使用本地已有代码继续部署..." else if [ ! -d /opt/project_app/.git ]; then # 如果目录不存在.git文件夹,检查目录是否为空 if [ "$(ls -A /opt/project_app)" ]; then # 目录不为空,创建临时目录克隆后复制文件 echo "目标目录已存在且不为空,使用临时目录克隆代码..." git clone -b $BRANCH $REPO_URL /tmp/project_app_temp if [ $? -eq 0 ]; then # 复制.git文件夹和所有文件 cp -r /tmp/project_app_temp/. /opt/project_app/ # 清理临时目录 rm -rf /tmp/project_app_temp else echo "警告: 克隆仓库失败,将使用本地已有代码继续部署..." fi else # 目录为空,直接克隆仓库 git clone -b $BRANCH $REPO_URL /opt/project_app fi cd /opt/project_app else # 如果目录已存在.git文件夹,则更新代码 cd /opt/project_app # 使用fast-forward方式更新,避免分支冲突 git fetch origin $BRANCH git merge --ff-only FETCH_HEAD || { echo "分支冲突,重置本地分支到远程最新版本..." git reset --hard origin/$BRANCH } fi # 确保有必要的配置文件 echo "确保配置文件存在..." git fetch origin $BRANCH git checkout origin/$BRANCH -- docker-compose.yml Dockerfile 2>/dev/null || true fi # 检查.env文件是否存在 echo "检查环境变量配置..." if [ ! -f .env ]; then echo "警告: .env文件不存在,请手动配置环境变量" echo "可以参考.env.example文件创建.env文件" else echo ".env文件已存在,跳过配置步骤" fi # 构建Docker镜像 echo "构建Docker镜像..." if [[ "$USE_ALTERNATE_BUILD" == "true" ]]; then # 使用docker build替代docker-compose build echo "使用docker build直接构建镜像..." docker build -t project_app-app . --no-cache if [ $? -eq 0 ]; then echo "镜像构建成功!" else echo "错误: 镜像构建失败!" exit 1 fi else # 使用正常的docker-compose build docker-compose build fi # 启动服务 echo "启动服务..." docker-compose up -d echo "部署完成!服务已启动并在后台运行。" echo "使用以下命令查看服务状态:docker-compose ps" echo "使用以下命令查看日志:docker-compose logs -f"