#!/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"