diff --git a/pull-and-restart.sh b/pull-and-restart.sh index 9f4ba55..cd3ccb6 100644 --- a/pull-and-restart.sh +++ b/pull-and-restart.sh @@ -1,12 +1,46 @@ #!/usr/bin/env bash -# 拉取代码并重启项目(线上项目根目录:/home/yxd/project/yh_web) -# 行尾:LF(.gitattributes) -# 用法:cd /home/yxd/project/yh_web && ./pull-and-restart.sh -# 或指定目录:PROJECT_ROOT=/home/yxd/project/yh_web ./pull-and-restart.sh +# 拉取代码并重启:检测 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" @@ -16,13 +50,36 @@ echo "==========================================" [ -f server/.env ] && set -a && source server/.env && set +a echo "[1/2] 拉取代码..." -git pull +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] 重新构建并启动(与 start-only-server 相同:API 用 GOPROXY/vendor)..." +echo "[2/2] 重新构建并启动..." export GOPROXY="${GOPROXY:-https://goproxy.cn,direct}" -docker compose build --no-cache -docker compose up -d --force-recreate +compose_cmd build --no-cache +compose_cmd up -d --force-recreate echo "" echo "完成. api:9527 web:9528 admin:9529" diff --git a/push-to-gitea.sh b/push-to-gitea.sh deleted file mode 100644 index 736ff32..0000000 --- a/push-to-gitea.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# 推送到 Gitea: https://gitea.yuxindazhineng.com/whm/web -set -e -cd "$(dirname "$0")" -GITEA_URL="https://gitea.yuxindazhineng.com/whm/web.git" - -if [ ! -d .git ]; then - echo "初始化 Git 仓库..." - git init - git branch -M main -fi - -if ! git remote get-url origin 2>/dev/null; then - echo "添加远程: $GITEA_URL" - git remote add origin "$GITEA_URL" -else - git remote set-url origin "$GITEA_URL" -fi - -echo "添加并提交..." -git add . -if [ -n "$(git status --porcelain)" ]; then - git commit -m "chore: push to gitea (yh_web)" -else - echo "无新变更" -fi -echo "推送到 origin..." -git push -u origin main || git push -u origin main --force -echo "完成: https://gitea.yuxindazhineng.com/whm/web" diff --git a/restart.sh b/restart.sh index 03e31cd..89a2a77 100644 --- a/restart.sh +++ b/restart.sh @@ -1,14 +1,48 @@ #!/usr/bin/env bash -# 仅重启项目(不拉代码),适用于配置/环境变更后重启 -# 行尾:LF(.gitattributes) -# 用法:cd /home/yxd/project/yh_web && ./restart.sh -# 或:PROJECT_ROOT=/home/yxd/project/yh_web ./restart.sh +# 直接重启:检测 Docker 并一键安装(无则安装),再 docker compose 重启,不拉代码 +# 用法:cd 项目根 && chmod +x restart.sh && ./restart.sh +# 行尾:LF set -e ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")" && pwd)}" cd "$ROOT" +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 +compose_cmd() { run_sudo docker compose "$@" 2>/dev/null || run_sudo docker-compose "$@"; } + echo "重启 yh_web ($ROOT)..." +[ -f server/.env ] && sed -i 's/\r$//' server/.env [ -f server/.env ] && set -a && source server/.env && set +a -docker compose down 2>/dev/null || docker-compose down -docker compose up -d 2>/dev/null || docker-compose up -d + +compose_cmd down 2>/dev/null || true +compose_cmd up -d + echo "完成. api:9527 web:9528 admin:9529" diff --git a/run-docker.sh b/run-docker.sh deleted file mode 100644 index 3e40571..0000000 --- a/run-docker.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -# 在 Docker 中运行项目,统一域名: https://yuheng.yuxindazhineng.com -# 端口: 9527=api, 9528=index, 9529=admin(直连);对外通过 nginx 80/443 -set -e -cd "$(dirname "$0")" - -echo "=== yh_web Docker 启动 ===" -echo "对外域名与 HTTPS 由 Nginx Proxy Manager 配置,本机端口: 9527=api, 9528=web, 9529=admin" -echo "" - -# 可选:从 server/.env 加载到当前 shell,供 docker-compose 使用 -if [ -f server/.env ]; then - set -a - source server/.env - set +a - echo "已加载 server/.env" -fi - -docker compose build --no-cache 2>/dev/null || docker-compose build --no-cache -docker compose up -d 2>/dev/null || docker-compose up -d - -echo "" -echo "已启动。请用 NPM 配置的域名访问(如 https://yuheng.yuxindazhineng.com)" -echo "直连: api :9527, web :9528, admin :9529" diff --git a/server/dev.bat b/server/dev.bat deleted file mode 100644 index 52c2e0d..0000000 --- a/server/dev.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "%~dp0" - -echo Starting backend with hot reload... -if not exist tmp mkdir tmp - -CompileDaemon -command=tmp\main.exe -build="go build -o tmp\main.exe ." diff --git a/server/scripts/start-ssh-tunnel.bat b/server/scripts/start-ssh-tunnel.bat deleted file mode 100644 index d01d5e4..0000000 --- a/server/scripts/start-ssh-tunnel.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -REM MongoDB SSH 穿透 - 将远程 27017 映射到本地 27017 -REM 运行此脚本后再启动 server,即可连接远程 MongoDB - -echo 正在建立 SSH 隧道... -echo 远程: www.yuxindazhineng.com:27017 -^> 本地: localhost:27017 -echo. -echo 保持此窗口打开,隧道有效。关闭窗口即断开。 -echo. - -ssh -p 2223 -L 27017:localhost:27017 yxd@www.yuxindazhineng.com - -pause diff --git a/start-direct.sh b/start-direct.sh deleted file mode 100644 index b2539f9..0000000 --- a/start-direct.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env bash -# 不通过 Docker,直接在本机启动:API(9527) + Web(9528) + Admin(9529) -# 自动检测并安装 Go、Node.js:Debian/Ubuntu 用 apt;Alibaba Cloud Linux(含等保三级版)用 yum/dnf;否则装到 $HOME。MongoDB 需自行安装或配置远程 MONGODB_URI -# 用法:chmod +x start-direct.sh && ./start-direct.sh -# 行尾:LF -set -e -ROOT="${PROJECT_ROOT:-$(cd "$(dirname "$0")" && pwd)}" -cd "$ROOT" -PIDFILE="$ROOT/.direct-run.pids" -INSTALL_ROOT="${INSTALL_ROOT:-$HOME}" - -# 是否能用 apt(Debian/Ubuntu 且可 sudo) -USE_APT=false -if command -v apt-get >/dev/null 2>&1; then - if [ "$(id -u)" = 0 ] || sudo -n true 2>/dev/null; then - USE_APT=true - fi -fi -# 是否能用 yum/dnf(Alibaba Cloud Linux / CentOS / RHEL 等,含等保三级版) -USE_YUM=false -if command -v dnf >/dev/null 2>&1 || command -v yum >/dev/null 2>&1; then - if [ "$(id -u)" = 0 ] || sudo -n true 2>/dev/null; then - USE_YUM=true - fi -fi - -# ---------- 自动安装 Go(未安装时)---------- -if ! command -v go >/dev/null 2>&1; then - if [ "$USE_APT" = true ]; then - echo "未检测到 Go,正在通过 apt 安装..." - sudo -n apt-get update -qq - sudo -n apt-get install -y golang-go - echo "Go 已安装: $(go version)" - elif [ "$USE_YUM" = true ]; then - echo "未检测到 Go,正在通过 yum/dnf 安装(兼容等保镜像)..." - if command -v dnf >/dev/null 2>&1; then - sudo -n dnf install -y golang - else - sudo -n yum install -y golang - fi - echo "Go 已安装: $(go version)" - else - echo "未检测到 Go,正在安装到 $INSTALL_ROOT/go-install ..." - GO_VER="1.21.13" - case "$(uname -m)" in - x86_64) GO_ARCH=amd64 ;; - aarch64|arm64) GO_ARCH=arm64 ;; - *) GO_ARCH=amd64 ;; - esac - GO_TGZ="go${GO_VER}.linux-${GO_ARCH}.tar.gz" - GO_URL="https://go.dev/dl/${GO_TGZ}" - mkdir -p "$INSTALL_ROOT/go-install" - ( cd "$INSTALL_ROOT" && ( curl -sL "$GO_URL" -o "$GO_TGZ" || wget -q -O "$GO_TGZ" "$GO_URL" ) && tar -xzf "$GO_TGZ" && mv go go-install && rm -f "$GO_TGZ" ) - export GOROOT="$INSTALL_ROOT/go-install" - export PATH="$GOROOT/bin:$PATH" - echo "Go 已安装: $(go version)" - fi -fi - -# ---------- 自动安装 Node.js(未安装时)---------- -if ! command -v node >/dev/null 2>&1; then - if [ "$USE_APT" = true ]; then - echo "未检测到 Node.js,正在通过 apt + NodeSource 安装 Node 20..." - curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - - sudo -n apt-get install -y nodejs - echo "Node 已安装: $(node -v)" - elif [ "$USE_YUM" = true ]; then - echo "未检测到 Node.js,正在通过 dnf/yum + NodeSource 安装 Node 20(兼容等保镜像)..." - curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - - if command -v dnf >/dev/null 2>&1; then - sudo -n dnf install -y nodejs - else - sudo -n yum install -y nodejs - fi - echo "Node 已安装: $(node -v)" - else - echo "未检测到 Node.js,正在通过 nvm 安装..." - export NVM_DIR="${NVM_DIR:-$HOME/.nvm}" - if [ ! -s "$NVM_DIR/nvm.sh" ]; then - mkdir -p "$NVM_DIR" - ( curl -sL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh || wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh ) | bash - fi - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" - nvm install 20 - nvm use 20 - echo "Node 已安装: $(node -v)" - fi -fi -# 若已有 nvm,确保当前 shell 可用 -[ -s "${NVM_DIR:-$HOME/.nvm}/nvm.sh" ] && \. "${NVM_DIR:-$HOME/.nvm}/nvm.sh" 2>/dev/null || true - -[ -f server/.env ] && sed -i 's/\r$//' server/.env -[ -f server/.env ] && set -a && source server/.env && set +a -export PORT="${PORT:-9527}" - -mkdir -p "$ROOT/logs" -echo "==========================================" -echo " yh_web 直接启动(无 Docker)" -echo " 路径: $ROOT" -echo " API:9527 Web:9528 Admin:9529" -echo "==========================================" -: > "$PIDFILE" - -# 1) API -echo "启动 API (port $PORT)..." -cd "$ROOT/server" -go build -o yh_api . 2>/dev/null || true -nohup ./yh_api >> "$ROOT/logs/api.log" 2>&1 & -echo $! >> "$PIDFILE" -cd "$ROOT" -sleep 1 - -# 避免 npm/vite 在脚本里只显示不刷新的 spinner,改为逐行输出 -export CI=1 -export FORCE_COLOR=0 - -# 2) Web 前端(需先构建;在服务器上重新安装依赖以获取当前平台 rollup 等原生包) -echo "构建并启动 Web (port 9528)..." -cd "$ROOT/web" -rm -rf node_modules package-lock.json -echo " [web] npm install(约 1~3 分钟)..." -npm install -echo " [web] vite build..." -chmod -R u+x node_modules/.bin 2>/dev/null || true -npx vite build -nohup npx serve -s dist -l 9528 >> "$ROOT/logs/web.log" 2>&1 & -echo $! >> "$PIDFILE" -cd "$ROOT" -sleep 1 - -# 3) Admin 前端(base /admin/,需放到 /admin 路径下再 serve) -echo "构建并启动 Admin (port 9529)..." -cd "$ROOT/admin" -rm -rf node_modules package-lock.json -echo " [admin] npm install(约 1~3 分钟)..." -npm install -echo " [admin] vite build..." -chmod -R u+x node_modules/.bin 2>/dev/null || true -npx vite build -ADMIN_SERVE="$ROOT/.admin-serve" -mkdir -p "$ADMIN_SERVE/admin" -cp -r dist/* "$ADMIN_SERVE/admin/" -nohup npx serve -s "$ADMIN_SERVE" -l 9529 >> "$ROOT/logs/admin.log" 2>&1 & -echo $! >> "$PIDFILE" -cd "$ROOT" - -echo "" -echo "已启动。PID 见 $PIDFILE" -echo "停止:xargs -a $PIDFILE kill 2>/dev/null" -echo "" -echo "检查是否成功:" -echo " 端口:ss -tlnp | grep -E '9527|9528|9529'" -echo " 请求:curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:9527/api/web/info (期望 200)" -echo " 日志:tail -5 $ROOT/logs/api.log $ROOT/logs/web.log $ROOT/logs/admin.log" -echo "完成. api:9527 web:9528 admin:9529" diff --git a/stop-docker.sh b/stop-docker.sh deleted file mode 100644 index 1ca15a4..0000000 --- a/stop-docker.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -cd "$(dirname "$0")" -docker compose down 2>/dev/null || docker-compose down -echo "已停止所有容器"