#!/usr/bin/env bash # # 更新这台机器上的部署。用法: # # ./deploy.sh # # 为什么需要脚本而不是一句 `git pull && docker compose up -d`: # 前端产物 api/webui 是 gitignore 的(它由 vite 生成),git pull 带不过来。 # 所以代码更新之后必须在服务器上重建一次前端,否则页面还是旧的。 # 这一步在容器里做,好处是服务器不需要装 Node —— 只有 Docker。 # # node_modules 和 npm 缓存都留在挂载目录内,重复构建不会重新下载。 set -euo pipefail cd "$(dirname "$0")" # 用镜像里的解释器跑,宿主机的 Python 版本无关。 IMAGE=mediacrawler:latest before=$(git rev-parse HEAD) git pull --ff-only after=$(git rev-parse HEAD) if [ "$before" = "$after" ]; then echo "== 代码已是最新($after)" else echo "== 代码更新 $before -> $after" git --no-pager log --oneline "$before..$after" | sed 's/^/ /' fi # 前端重建的两种情况:产物根本不存在(首次部署),或 webui/ 有改动。 if [ ! -f api/webui/index.html ]; then need_build=1 reason="前端产物不存在" elif [ "$before" != "$after" ] && ! git diff --quiet "$before" "$after" -- webui/; then need_build=1 reason="webui/ 有改动" else need_build=0 reason="" fi if [ "$need_build" = "1" ]; then echo "== 重建前端($reason)" # -u 1000:1000 而不是 root:这里产出的文件要留在这个目录里给后面用, # 以 root 生成的 node_modules 会让下次构建和人工清理都变得别扭。 # HOME 指向挂载目录,这样 npm 的缓存在宿主机上,重建时能复用。 docker run --rm \ -u 1000:1000 \ -w /app/webui \ -v "$PWD:/app" \ -e HOME=/app/webui \ -e npm_config_registry=https://registry.npmmirror.com \ "$IMAGE" sh -c 'npm ci --no-audit --no-fund && npm run build' else echo "== 前端无改动,跳过构建" fi echo "== 重启容器" docker compose up -d docker compose ps