feat(ops): SEO 解封一键脚本——预览确认执行自检回滚五段式

nginx 侧全自动(snippet 剥离/内部 vhost 补回/admin 局部/失败回
滚/源站终验),ESA 三动作打印手动步骤;dry-run 先行+确认门。

验证: bash -n 语法过;dry-run 输出与 Phase 5f T1 操作单变更计划一致

Spec: none (用户操作单自动化,Phase 5f T1 收尾件)

Co-authored-by: GLM-5.3
This commit is contained in:
wait4xandGLM-5.3 committed 2026-11-01 11:06:58 +08:00
1 parent bb29c8abaf
commit 50c7595838
1 file changed
+88
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/env bash
# SEO 解封脚本(Phase 5f T1 操作单自动化)
# 作用:①剥共享 snippet 的全站 noindex ②内部服务 vhost 补回 ③博客 vhost /admin 局部 noindex
# ④nginx -t 后重载,失败自动回滚 ⑤终验三条 curl
# ESA 控制台三动作(purge/TTL/绕缓存)无法脚本化,结尾打印手动步骤。
# 用法:bash scripts/ops/seo-unblock.sh (需要 sudo,全程有预览和确认)
set -euo pipefail
SNIPPET=/etc/nginx/snippets/esa-origin-ssl.conf
BAK="${SNIPPET}.bak-$(date +%s)"
SITES=/etc/nginx/sites-enabled
echo "==== ① 现状 ===="
sudo grep -n "X-Robots-Tag" "$SNIPPET" || echo "(snippet 已无 noindex——可能已执行过)"
echo
echo "==== ② 变更计划(DRY-RUN)===="
echo " [snippet] ${SNIPPET}:删除 X-Robots-Tag noindex 行"
for f in "$SITES"/*; do
names=$(sudo grep -h "server_name" "$f" 2>/dev/null || true)
[ -z "$names" ] && continue
# 内部服务判定:server_name 含内部子域且不含主站裸域
if echo "$names" | grep -qE "(git|api|oj|token|fc|latex|cpa)\.wait4x\.online" && ! echo "$names" | grep -qw "wait4x.online"; then
sudo grep -q "X-Robots-Tag" "$f" || echo " [补回] $f:server 块加 add_header X-Robots-Tag noindex always;"
fi
# 博客主站判定:server_name 恰含裸域
if echo "$names" | grep -qw "wait4x.online"; then
sudo grep -q "location /admin/" "$f" || echo " [新增] $f:location /admin/ { noindex }"
fi
done
echo
read -rp ">> 按计划执行?(y/N) " ok; [ "$ok" = "y" ] || { echo "已取消(未做任何修改)"; exit 0; }
echo
echo "==== ③ 执行 ===="
sudo cp "$SNIPPET" "$BAK" && echo " 备份:$BAK"
sudo sed -i '/X-Robots-Tag noindex/d' "$SNIPPET" && echo " snippet 已剥 noindex"
for f in "$SITES"/*; do
names=$(sudo grep -h "server_name" "$f" 2>/dev/null || true)
[ -z "$names" ] && continue
if echo "$names" | grep -qE "(git|api|oj|token|fc|latex|cpa)\.wait4x\.online" && ! echo "$names" | grep -qw "wait4x.online"; then
if ! sudo grep -q "X-Robots-Tag" "$f"; then
sudo cp "$f" "$f.bak-seo"
# 在首个 server_name 行后插入(server 块内、顶层指令位置合法)
sudo sed -i "0,/server_name/s/\(server_name.*\)/\1\n add_header X-Robots-Tag noindex always;/" "$f"
echo " 补回:$f"
fi
fi
if echo "$names" | grep -qw "wait4x.online"; then
if ! sudo grep -q "location /admin/" "$f"; then
sudo cp "$f" "$f.bak-seo" 2>/dev/null || sudo cp "$f" "$f.bak-seo"
sudo sed -i "0,/server_name/s/\(server_name.*\)/\1\n location \/admin\/ { add_header X-Robots-Tag noindex always; }/" "$f"
echo " admin 局部:$f"
fi
fi
done
echo
echo "==== ④ 语法检查+重载(失败自动回滚)===="
if ! sudo nginx -t; then
echo "!! nginx -t 失败,回滚全部改动"
sudo cp "$BAK" "$SNIPPET"
for f in "$SITES"/*.bak-seo; do
[ -f "$f" ] && sudo cp "$f" "${f%.bak-seo}"
done
sudo nginx -t && sudo systemctl reload nginx
echo "已回滚,请把以上报错发给 research 人工处理"; exit 1
fi
sudo systemctl reload nginx && echo " nginx 已重载"
echo
echo "==== ⑤ 终验(对源站直测)===="
H=$(curl -sI --noproxy '*' -m 10 https://wait4x.online/ | grep -ci x-robots-tag || true)
A=$(curl -sI --noproxy '*' -m 10 https://wait4x.online/admin/ | grep -ci noindex || true)
echo " 主站 noindex 头:$H(期望 0) /admin/ noindex:$A(期望 1)"
if [ "$H" = "0" ] && [ "$A" = "1" ]; then echo " ✅ 源站解封成功"; else echo " ⚠️ 不符预期——把上面两行发给 research"; fi
cat <<'EOF'
==== ⑥ 剩余手动步骤:ESA 控制台(无法脚本化)====
1. 全站 purge:wait4x.online(不做的话 noindex 头在边缘再活 30 天)
2. HTML 边缘缓存 TTL 调 ≤1 小时(当前 30 天)
3. 加规则:/artalk/api/* 路径绕过缓存(pv 数字不再冻结)
4. 顺带查 git.wait4x.online 为何 522(源站健康/回源配置)
完成后告诉 research:将跑生产 Lighthouse 入档(预期 SEO 60→95+)。
EOF