Files
OpenStats/Scripts/deploy_site.sh
T
gentpan 0342074489 IP 归属地改用本地 MaxMind GeoLite2:自研 .mmdb 读取器、服务器定时同步、应用校验下载与导入
- Metrics:MaxMindDatabase 按 MaxMind DB 2.0 规范解析搜索树与数据段(内存映射,无第三方依赖),GeoLookup 取国家、城市与 ASN
- 服务器:server/geoip 下的更新脚本与 systemd 定时器,License Key 只放在服务器 /etc/openstats/maxmind.env,生成 manifest.json
- 应用:GeoDatabaseController 每 3 天检查清单,下载后校验 sha256 与库类型再替换;支持从文件导入、可选城市库
- 有本地库时只向外查询公网 IP,归属地与 ASN 本机查询;网络详情标明数据来源;官网部署排除 /geoip/
- 新增读取器单元测试;更新隐私说明、第三方声明与架构文档
2026-09-13 06:40:05 +05:00

52 lines
2.2 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"
# geoip/ 由服务器上的定时任务生成,不在 web/ 里——排除掉,否则 --delete 会把数据库删了
rsync -az --delete --exclude /geoip/ -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