51 lines
2.1 KiB
Bash
Executable File
51 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
||
# 把 web/ 发布到 getopenstats.com(Caddy 静态站点,前面是 Cloudflare 橙云)。
|
||
#
|
||
# 静态资源在 Cloudflare 缓存一天,同一个 URL 换了内容,线上仍会拿到旧文件。
|
||
# 所以每个资源 URL 带 ?v=内容指纹:内容变了指纹就变,URL 跟着变。
|
||
# 最后按公网实际拿到的内容校验,而不是只看源站。
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
|
||
HOST="${SITE_HOST:-debian@15.204.80.137}"
|
||
KEY="${SITE_KEY:-$HOME/.ssh/gentpan.pem}"
|
||
ROOT="${SITE_ROOT:-/var/www/getopenstats.com}"
|
||
DOMAIN="${SITE_DOMAIN:-getopenstats.com}"
|
||
SSH=(ssh -i "$KEY" -o BatchMode=yes)
|
||
|
||
# 官网里的更新日志由 CHANGELOG.md 生成,发布前先同步
|
||
python3 Scripts/sync_changelog.py
|
||
|
||
# 先洗掉 ?v= 再算指纹,否则指纹会把自己算进去,内容没变也每次换值
|
||
STAMP="$( { cat web/styles.css web/replica.css web/app.js web/replica.js | /usr/bin/sed -E 's/\?v=[A-Za-z0-9]+//g'
|
||
find web/assets -type f | sort | xargs cat; } | shasum -a 256 | cut -c1-8)"
|
||
echo "内容指纹 v=$STAMP"
|
||
/usr/bin/sed -i '' -E "s/\?v=[A-Za-z0-9]+/?v=$STAMP/g" web/index.html
|
||
|
||
# 目录归部署用户所有,Caddy 只需读取
|
||
"${SSH[@]}" "$HOST" "sudo mkdir -p $ROOT && sudo chown -R \$(id -un):\$(id -gn) $ROOT"
|
||
rsync -az --delete -e "${SSH[*]}" web/ "$HOST:$ROOT/"
|
||
"${SSH[@]}" "$HOST" "sudo chmod -R a+rX $ROOT"
|
||
echo "已同步到 $HOST:$ROOT"
|
||
|
||
# 校验公网:Cloudflare 上拿到的文件大小与本地一致,首页引用的是新指纹
|
||
fail=0
|
||
for f in styles.css replica.css app.js replica.js; do
|
||
want=$(stat -f%z "web/$f")
|
||
got=$(curl -s -o /dev/null -w '%{size_download}' --max-time 20 "https://$DOMAIN/$f?v=$STAMP" || true)
|
||
if [ "$want" = "$got" ]; then
|
||
printf " ✅ %-12s %s B\n" "$f" "$got"
|
||
else
|
||
printf " ❌ %-12s 线上 %s B ≠ 本地 %s B\n" "$f" "$got" "$want"
|
||
fail=1
|
||
fi
|
||
done
|
||
refs=$(curl -s --max-time 20 "https://$DOMAIN/" | grep -c "?v=$STAMP" || true)
|
||
if [ "${refs:-0}" -gt 0 ]; then
|
||
printf " ✅ 首页 引用 %s 处新指纹\n" "$refs"
|
||
else
|
||
printf " ❌ 首页仍在引用旧指纹,或域名尚未解析\n"
|
||
fail=1
|
||
fi
|
||
exit $fail
|