86 lines
3.1 KiB
Bash
86 lines
3.1 KiB
Bash
#!/usr/bin/env bash
|
||
# 拉取代码并重启:检测 Docker 并一键安装(无则安装),再 git pull + docker compose 构建并启动
|
||
# 用法:cd 项目根 && chmod +x pull-and-restart.sh && ./pull-and-restart.sh
|
||
# 行尾:LF
|
||
set -e
|
||
ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")" && pwd)}"
|
||
cd "$ROOT"
|
||
|
||
# 需要 sudo 时直接调用(会提示输入密码)
|
||
run_sudo() { sudo "$@"; }
|
||
|
||
# ---------- 检测并安装 Docker ----------
|
||
ensure_docker() {
|
||
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
|
||
echo "Docker 已就绪."
|
||
return 0
|
||
fi
|
||
echo "未检测到 Docker 或未启动,正在安装..."
|
||
if command -v apt-get >/dev/null 2>&1; then
|
||
run_sudo apt-get update -qq
|
||
run_sudo apt-get install -y docker.io docker-compose-plugin 2>/dev/null || run_sudo apt-get install -y docker.io docker-compose
|
||
run_sudo systemctl start docker
|
||
run_sudo systemctl enable docker
|
||
elif command -v dnf >/dev/null 2>&1 || command -v yum >/dev/null 2>&1; then
|
||
if command -v dnf >/dev/null 2>&1; then
|
||
run_sudo dnf install -y docker docker-compose-plugin 2>/dev/null || run_sudo dnf install -y docker docker-compose
|
||
else
|
||
run_sudo yum install -y docker docker-compose-plugin 2>/dev/null || run_sudo yum install -y docker docker-compose
|
||
fi
|
||
run_sudo systemctl start docker
|
||
run_sudo systemctl enable docker
|
||
else
|
||
echo "无法自动安装 Docker,请先安装 Docker 与 Docker Compose 后重试."
|
||
exit 1
|
||
fi
|
||
echo "Docker 安装完成."
|
||
}
|
||
|
||
ensure_docker
|
||
# 本脚本内统一用 sudo 执行 docker(避免权限问题)
|
||
docker_cmd() { run_sudo docker "$@"; }
|
||
compose_cmd() { run_sudo docker compose "$@" 2>/dev/null || run_sudo docker-compose "$@"; }
|
||
|
||
echo "=========================================="
|
||
echo " yh_web 拉取并重启"
|
||
echo " 路径: $ROOT"
|
||
echo "=========================================="
|
||
|
||
[ -f server/.env ] && sed -i 's/\r$//' server/.env
|
||
[ -f server/.env ] && set -a && source server/.env && set +a
|
||
|
||
echo "[1/2] 拉取代码..."
|
||
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||
git pull
|
||
else
|
||
echo "未检测到 Git 仓库,正在克隆(需设置 GIT_REPO_URL,例:export GIT_REPO_URL='https://用户:Token@gitea.../web.git')..."
|
||
export GIT_TERMINAL_PROMPT=0
|
||
REPO_URL="${GIT_REPO_URL:-}"
|
||
BRANCH="${GIT_BRANCH:-master}"
|
||
if [ -z "$REPO_URL" ]; then
|
||
echo "错误:请设置环境变量 GIT_REPO_URL 后重试."
|
||
exit 1
|
||
fi
|
||
SELF="$(basename "$0")"
|
||
tmp_backup="/tmp/yh_web_deploy_$$"
|
||
mkdir -p "$tmp_backup"
|
||
[ -f "$SELF" ] && cp -a "$SELF" "$tmp_backup/"
|
||
[ -f server/.env ] && cp -a server/.env "$tmp_backup/" 2>/dev/null || true
|
||
git init -b "$BRANCH"
|
||
git remote add origin "$REPO_URL"
|
||
git fetch origin --progress
|
||
git reset --hard "origin/$BRANCH"
|
||
[ -f "$tmp_backup/$SELF" ] && cp -a "$tmp_backup/$SELF" "$SELF" && chmod +x "$SELF"
|
||
[ -f "$tmp_backup/.env" ] && mkdir -p server && cp -a "$tmp_backup/.env" server/.env
|
||
rm -rf "$tmp_backup"
|
||
fi
|
||
|
||
echo ""
|
||
echo "[2/2] 重新构建并启动..."
|
||
export GOPROXY="${GOPROXY:-https://goproxy.cn,direct}"
|
||
compose_cmd build --no-cache
|
||
compose_cmd up -d --force-recreate
|
||
|
||
echo ""
|
||
echo "完成. api:9527 web:9528 admin:9529"
|