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.
 
 

155 lines
5.5 KiB

#!/bin/bash
# 部署脚本 - 微信小程序后端服务
echo "开始部署微信小程序后端服务..."
# 检查是否安装了Docker
echo "检查Docker是否安装..."
if ! command -v docker &> /dev/null; then
echo "错误: Docker未安装,请先安装Docker"
exit 1
fi
# 检查并更新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版本
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版本 $buildx_version 低于要求的0.17,正在强制升级..."
# 1. 停止Docker服务
systemctl stop docker 2>/dev/null || true
sleep 3
# 2. 卸载旧版本Buildx
rm -rf ~/.docker/cli-plugins/docker-buildx 2>/dev/null || true
rm -rf /usr/libexec/docker/cli-plugins/docker-buildx 2>/dev/null || true
docker buildx uninstall 2>/dev/null || true
sleep 2
# 3. 重新安装Docker服务
systemctl start docker 2>/dev/null || true
sleep 5
# 4. 安装最新版本Buildx
docker buildx install
# 5. 再次重启Docker服务
systemctl restart docker 2>/dev/null || true
sleep 5
# 6. 创建并使用默认构建器
docker buildx create --name mybuilder --driver docker-container --use 2>/dev/null || true
fi
# 再次验证Buildx版本
new_buildx_version=$(docker buildx version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+' | head -1 || echo "0.0")
echo "升级后Buildx版本: $new_buildx_version"
# 如果Buildx版本仍然不足,尝试使用docker build替代docker-compose build
if [[ "$new_buildx_version" < "0.17" ]]; then
echo "警告: Buildx版本仍然低于0.17,将尝试使用替代方案构建镜像..."
# 创建一个环境变量标记,后续使用
export USE_ALTERNATE_BUILD="true"
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"