chore(repo): 移除废弃 GeoIP 和官网部署脚本

This commit is contained in:
ysicing committed 2026-10-01 18:12:39 +08:00
1 parent 9db2b7e789
commit beed5296e4
7 files changed
+2 -176

No files matched your search

+2 -4
View File
@@ -332,10 +332,8 @@ the quota reader has no access to session-log content.
If cleanip.io sees a different exit than Cloudflare (split-routing proxies), its address is shown.
Results are cached per IP for an hour in memory and for a week on disk (failed lookups are not
cached), and a 429 stops further calls until the next UTC day. Country
codes are validated before being used as flag file names. `server/geoip/` still holds the systemd
timer that syncs MaxMind GeoLite2 onto `getopenstats.com/geoip/` (account and key in
`/etc/openstats/maxmind.env` on the server); the app no longer downloads those files, they are kept
for other uses.
codes are validated before being used as flag file names. The app does not download or read local
GeoIP databases; the retired database synchronization and deployment scripts have been removed.
Each public-IP query owns a cancellable task and generation token. Disabling lookup clears the
cache and invalidates the query; sleep or lock pauses it. Every asynchronous stage and final cache
write checks both generation and current settings, so late callbacks cannot restore cleared data
-52
View File
@@ -1,52 +0,0 @@
#!/bin/bash
# 把 web/ 发布到 getopenstats.com(Caddy 静态站点,前面是 Cloudflare 橙云)。
#
# 静态资源在 Cloudflare 缓存一天,同一个 URL 换了内容,线上仍会拿到旧文件。
# 所以每个资源 URL 带 ?v=内容指纹:内容变了指纹就变,URL 跟着变。
# 最后按公网实际拿到的内容校验,而不是只看源站。
set -euo pipefail
cd "$(dirname "$0")/.."
HOST="${SITE_HOST:-debian@51.38.126.148}"
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/ 由服务器上的定时任务生成,download/ 是 publish_release.sh 上传的安装包,都不在 web/ 里——
# 排除掉,否则 --delete 会把它们删了
rsync -az --delete --exclude /geoip/ --exclude /download/ -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
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
# 把 MaxMind 账号与 License Key 写到服务器的 /etc/openstats/maxmind.env,然后立刻同步一次 GeoLite2 数据库。
# 值在本机终端里输入(Key 不回显),只经 ssh 传到服务器,不进仓库、不进日志。
#
# ./server/geoip/configure.sh
set -euo pipefail
HOST="${SITE_HOST:-debian@51.38.126.148}"
KEY="${SITE_KEY:-$HOME/.ssh/gentpan.pem}"
SSH=(ssh -i "$KEY" -o BatchMode=yes "$HOST")
read -r -p "MaxMind Account ID: " ACCOUNT
read -r -s -p "MaxMind License Key: " LICENSE; echo
[ -n "$ACCOUNT" ] && [ -n "$LICENSE" ] || { echo "两项都要填" >&2; exit 1; }
case "$ACCOUNT$LICENSE" in *[!A-Za-z0-9_]*) echo "账号或 Key 含有意外字符" >&2; exit 1 ;; esac
# 通过标准输入写入,命令行参数里不出现 Key
printf 'MAXMIND_ACCOUNT_ID=%s\nMAXMIND_LICENSE_KEY=%s\n' "$ACCOUNT" "$LICENSE" \
| "${SSH[@]}" 'sudo mkdir -p /etc/openstats && sudo tee /etc/openstats/maxmind.env >/dev/null && sudo chmod 600 /etc/openstats/maxmind.env && echo "已写入 /etc/openstats/maxmind.env"'
echo "开始第一次同步(三个库约 80 MB,需要一两分钟)…"
"${SSH[@]}" 'sudo systemctl start openstats-geoip.service && cat /var/www/getopenstats.com/geoip/manifest.json && echo'
-21
View File
@@ -1,21 +0,0 @@
#!/bin/bash
# 把 GeoLite2 更新脚本与定时任务装到服务器(不包含 License Key)。
# ./server/geoip/install.sh
set -euo pipefail
cd "$(dirname "$0")"
HOST="${SITE_HOST:-debian@51.38.126.148}"
KEY="${SITE_KEY:-$HOME/.ssh/gentpan.pem}"
SSH=(ssh -i "$KEY" -o BatchMode=yes "$HOST")
scp -i "$KEY" -o BatchMode=yes openstats-geoip-update.sh openstats-geoip.service openstats-geoip.timer "$HOST:/tmp/"
"${SSH[@]}" 'set -e
sudo install -m 755 /tmp/openstats-geoip-update.sh /usr/local/bin/openstats-geoip-update
sudo install -m 644 /tmp/openstats-geoip.service /tmp/openstats-geoip.timer /etc/systemd/system/
sudo install -d -m 755 /var/www/getopenstats.com/geoip
# 只保证目录存在,保留已有权限,避免影响同机共用此目录的其他服务。
sudo mkdir -p /etc/openstats
sudo systemctl daemon-reload
sudo systemctl enable --now openstats-geoip.timer
rm -f /tmp/openstats-geoip-update.sh /tmp/openstats-geoip.service /tmp/openstats-geoip.timer
systemctl list-timers openstats-geoip.timer --no-pager | head -3
if sudo test -f /etc/openstats/maxmind.env; then echo "已找到 License Key 配置"; else echo "还没有 /etc/openstats/maxmind.env"; fi'
-56
View File
@@ -1,56 +0,0 @@
#!/bin/bash
# 在服务器上定时下载 MaxMind GeoLite2 数据库,放到官网 /geoip/ 下供 OpenStats 更新。
#
# 账号与 License Key 只放在 /etc/openstats/maxmind.env(root 所有,权限 600),
# 不进仓库、不进应用。文件内容:
# MAXMIND_ACCOUNT_ID=你的账号
# MAXMIND_LICENSE_KEY=你的 Key
#
# 每个库先下载 tar.gz 与官方 sha256 校验,解出 .mmdb 后原子替换,最后重写 manifest.json。
set -euo pipefail
ENV_FILE="${ENV_FILE:-/etc/openstats/maxmind.env}"
OUT="${OUT:-/var/www/getopenstats.com/geoip}"
EDITIONS=(${EDITIONS:-GeoLite2-ASN GeoLite2-Country GeoLite2-City})
[ -r "$ENV_FILE" ] || { echo "缺少 $ENV_FILE" >&2; exit 1; }
# shellcheck disable=SC1090
source "$ENV_FILE"
: "${MAXMIND_ACCOUNT_ID:?}" "${MAXMIND_LICENSE_KEY:?}"
WORK="$(mktemp -d)"
trap 'rm -rf "$WORK"' EXIT
mkdir -p "$OUT"
fetch() {
# 凭据通过 curl 配置从标准输入传入,不出现在进程参数里
printf 'user = "%s:%s"\n' "$MAXMIND_ACCOUNT_ID" "$MAXMIND_LICENSE_KEY" \
| curl --config - -fsSL --retry 3 -o "$2" "https://download.maxmind.com/geoip/databases/$1/download?suffix=$3"
}
entries=()
for edition in "${EDITIONS[@]}"; do
fetch "$edition" "$WORK/$edition.tar.gz" "tar.gz"
fetch "$edition" "$WORK/$edition.tar.gz.sha256" "tar.gz.sha256"
expected="$(cut -d' ' -f1 "$WORK/$edition.tar.gz.sha256")"
actual="$(sha256sum "$WORK/$edition.tar.gz" | cut -d' ' -f1)"
[ "$expected" = "$actual" ] || { echo "$edition 校验失败" >&2; exit 1; }
tar -xzf "$WORK/$edition.tar.gz" -C "$WORK"
folder="$(find "$WORK" -maxdepth 1 -type d -name "${edition}_*" | sort | tail -1)"
build="${folder##*_}" # 目录名形如 GeoLite2-ASN_20260912
install -m 644 "$folder/$edition.mmdb" "$OUT/.$edition.mmdb.new"
mv -f "$OUT/.$edition.mmdb.new" "$OUT/$edition.mmdb"
sha="$(sha256sum "$OUT/$edition.mmdb" | cut -d' ' -f1)"
size="$(stat -c %s "$OUT/$edition.mmdb")"
entries+=("{\"edition\":\"$edition\",\"file\":\"$edition.mmdb\",\"build\":\"$build\",\"sha256\":\"$sha\",\"size\":$size}")
echo "$edition $build $size 字节"
done
joined="$(IFS=,; echo "${entries[*]}")"
printf '{"generated":"%s","attribution":"This product includes GeoLite2 data created by MaxMind, available from https://www.maxmind.com.","databases":[%s]}\n' \
"$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$joined" > "$OUT/.manifest.json.new"
mv -f "$OUT/.manifest.json.new" "$OUT/manifest.json"
chmod 644 "$OUT/manifest.json"
echo "manifest.json 已更新"
-13
View File
@@ -1,13 +0,0 @@
[Unit]
Description=下载 MaxMind GeoLite2 数据库供 OpenStats 更新
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/openstats-geoip-update
# 只需要写官网的 geoip 目录
ProtectSystem=strict
ReadWritePaths=/var/www/getopenstats.com/geoip /tmp
PrivateTmp=true
NoNewPrivileges=true
-10
View File
@@ -1,10 +0,0 @@
[Unit]
Description=每周二、周五更新 GeoLite2(MaxMind 在这两天发布新数据)
[Timer]
OnCalendar=Tue,Fri *-*-* 08:00:00 UTC
RandomizedDelaySec=30m
Persistent=true
[Install]
WantedBy=timers.target