Files
OpenStats/Scripts/deploy_site.sh
T

51 lines
2.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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