#!/usr/bin/env bash # HomeDash host 模式部署(切换成"单容器即入口"之后使用) # # 为什么不能用 deploy/zd.sh: # zd.sh 靠"改门户 nginx 的上游端口 + 双端口轮换"实现零停机,前提是入口 # (portal-nginx)独立于应用容器。切换之后入口就是 navi 容器本身, # host 网络下端口即入口,没有可轮换的第二组端口 —— 那套脚本会失效。 # # 本脚本的策略(用户已明确接受数秒闪断): # 构建 → 上传 → 停旧容器 → 起新容器(host 网络)→ 全面校验 → 改名 # 任一步失败:删掉新容器、把旧容器改名回去并启动(自动回滚) # # 用法: deploy/zd-host.sh # 环境变量: NAVI_HOST / NAVI_SSH_PASS / NAVI_DATA_DIR / NAVI_CERT_DIR / NAVI_BASE_IMAGE set -euo pipefail VER="${1:?用法: deploy/zd-host.sh }" TAG="homedash:ui-${VER}" STAMP="$(date +%Y%m%d%H%M%S)" HOST="${NAVI_HOST:-}" # 必填:NAVI_HOST=user@host(仓库不预置任何真实地址) # 必填校验要在赋值之后(set -u 下提前引用会直接 unbound variable) [ -n "$HOST" ] || { echo "!! 请指定目标机:NAVI_HOST=user@host bash $0 <版本>" >&2; exit 2; } SSH_PASS="${NAVI_SSH_PASS:-}" DATA_DIR="${NAVI_DATA_DIR:-/vol1/docker/navi-data}" CERT_DIR="${NAVI_CERT_DIR:-/vol1/docker/cert}" BASE_IMAGE="${NAVI_BASE_IMAGE:-jianf-navi:latest}" SRC="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" CTX=/tmp/homedash-ctx TAR="/tmp/homedash-${VER}.tar.gz" REMOTE_TAR="/tmp/homedash-${VER}-${STAMP}.tar.gz" SSH_OPTS=(-o StrictHostKeyChecking=no) if [ -n "$SSH_PASS" ]; then SSH=(sshpass -p "$SSH_PASS" ssh "${SSH_OPTS[@]}" "$HOST") SCP=(sshpass -p "$SSH_PASS" scp -q "${SSH_OPTS[@]}") else SSH=(ssh "${SSH_OPTS[@]}" "$HOST") SCP=(scp -q "${SSH_OPTS[@]}") fi echo "== 1/3 本地构建 ${TAG}(源码 ${SRC})==" cd "$SRC" node --check web/navi.js (cd admin-server && gofmt -l . && go test ./... >/dev/null) (cd history-server && gofmt -l . && go test ./... >/dev/null) rm -rf "$CTX"; mkdir -p "$CTX/runtime" "$CTX/web/extension" "$CTX/admin" "$CTX/portal" "$CTX/ext" (cd history-server && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o "$CTX/runtime/history-server" .) (cd admin-server && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o "$CTX/runtime/admin-server" .) # 扩展包必须从当前源码重打:不能继承基镜像里的旧包。 # 实测踩坑(2026-10-02):增量 Dockerfile 只 COPY install.html,zip/xpi 全部 # 来自基镜像,导致 chrome background 的修复升级后仍不生效(包是 3 周前的)。 (cd extension/chrome && zip -qr "$CTX/ext/navi-chrome.zip" .) (cd extension/firefox && zip -qr "$CTX/ext/navi-firefox.xpi" .) cp nginx.conf supervisord.conf searxng-settings.yml conf.example.yml "$CTX/" cp deploy/cert-agent.sh "$CTX/cert-agent.sh" cp admin/index.html "$CTX/admin/index.html" cp -a portal/. "$CTX/portal/" cp web/extension/install.html "$CTX/web/extension/install.html" cp web/navi.js web/navi.css web/patch-index.py "$CTX/web/" cat > "$CTX/Dockerfile" <