99 lines
3.4 KiB
Bash
99 lines
3.4 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
# 备案期间:临时用 http://<服务器IP>:8321 访问博客(不走域名/80/443)
|
|||
|
|
#
|
|||
|
|
# 用法: ./deploy/ip-preview.sh
|
|||
|
|
# 前置: ① 服务器安全组/防火墙放行 TCP 8321
|
|||
|
|
# ② 本机配好到服务器的 SSH 免密(REMOTE_HOST 连不通时改成服务器 IP)
|
|||
|
|
# 幂等可重跑:每次重新构建同步 + 重写 8321 配置。
|
|||
|
|
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
# ====== 配置区(与 deploy.sh 保持一致,ssh 不通时 REMOTE_HOST 填服务器 IP) ======
|
|||
|
|
REMOTE_USER="root" # SSH 用户(服务器是 ubuntu 用户的话改成 ubuntu)
|
|||
|
|
REMOTE_HOST="sausagetoast.cloud" # VPS 地址(备案期间建议填服务器 IP)
|
|||
|
|
REMOTE_DIR="/var/www/yukun" # 博客站点根目录
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
SSH_TARGET="${REMOTE_USER}@${REMOTE_HOST}"
|
|||
|
|
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|||
|
|
SSH_OPTS="-o StrictHostKeyChecking=accept-new"
|
|||
|
|
|
|||
|
|
echo "==> [1/3] 构建站点 (astro build)..."
|
|||
|
|
cd "$ROOT_DIR"
|
|||
|
|
npm run build
|
|||
|
|
[ -d "$ROOT_DIR/dist" ] || { echo "✗ 构建失败:dist 不存在"; exit 1; }
|
|||
|
|
|
|||
|
|
echo "==> [2/3] 同步到 ${SSH_TARGET}:${REMOTE_DIR} ..."
|
|||
|
|
rsync -avz --delete --human-readable \
|
|||
|
|
"$ROOT_DIR/dist/" "${SSH_TARGET}:${REMOTE_DIR}/"
|
|||
|
|
|
|||
|
|
echo "==> 生成 8321 访问配置并上传 ..."
|
|||
|
|
cat > /tmp/yukun-ip-preview.conf <<'NGINX'
|
|||
|
|
# 备案期间:临时用 http://<服务器IP>:8321 访问博客(由 deploy/ip-preview.sh 生成)
|
|||
|
|
# 不监听 80/443,与正式站点配置互不干扰;备案完成后删除此文件即可。
|
|||
|
|
server {
|
|||
|
|
listen 8321;
|
|||
|
|
server_name _;
|
|||
|
|
|
|||
|
|
root /var/www/yukun;
|
|||
|
|
index index.html;
|
|||
|
|
|
|||
|
|
gzip on;
|
|||
|
|
gzip_vary on;
|
|||
|
|
gzip_min_length 1024;
|
|||
|
|
gzip_comp_level 6;
|
|||
|
|
gzip_types
|
|||
|
|
text/plain
|
|||
|
|
text/css
|
|||
|
|
text/xml
|
|||
|
|
text/javascript
|
|||
|
|
application/javascript
|
|||
|
|
application/x-javascript
|
|||
|
|
application/json
|
|||
|
|
application/xml
|
|||
|
|
application/xml+rss
|
|||
|
|
image/svg+xml;
|
|||
|
|
|
|||
|
|
location ~* \.(?:css|js|woff2?|ttf|otf|svg|png|jpg|jpeg|gif|webp|ico|avif)$ {
|
|||
|
|
expires 30d;
|
|||
|
|
add_header Cache-Control "public, immutable";
|
|||
|
|
access_log off;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
location = /sitemap-index.xml { add_header Cache-Control "no-cache"; }
|
|||
|
|
location ~ ^/sitemap.* { add_header Cache-Control "no-cache"; }
|
|||
|
|
|
|||
|
|
location / {
|
|||
|
|
try_files $uri $uri/ $uri.html =404;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
error_page 404 /404.html;
|
|||
|
|
|
|||
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|||
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|||
|
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|||
|
|
|
|||
|
|
access_log /var/log/nginx/yukun.access.log;
|
|||
|
|
error_log /var/log/nginx/yukun.error.log;
|
|||
|
|
}
|
|||
|
|
NGINX
|
|||
|
|
scp $SSH_OPTS /tmp/yukun-ip-preview.conf "$SSH_TARGET:/tmp/yukun-ip-preview.conf"
|
|||
|
|
rm -f /tmp/yukun-ip-preview.conf
|
|||
|
|
|
|||
|
|
echo "==> [3/3] 远端启用 8321 配置 ..."
|
|||
|
|
ssh $SSH_OPTS "$SSH_TARGET" "bash -s" <<'REMOTE'
|
|||
|
|
set -euo pipefail
|
|||
|
|
SUDO=""
|
|||
|
|
[ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|||
|
|
$SUDO cp /tmp/yukun-ip-preview.conf /etc/nginx/conf.d/ip-preview.conf
|
|||
|
|
rm -f /tmp/yukun-ip-preview.conf
|
|||
|
|
echo "==> 测试 nginx 配置 ..."
|
|||
|
|
$SUDO nginx -t
|
|||
|
|
echo "==> reload nginx ..."
|
|||
|
|
$SUDO systemctl reload nginx || $SUDO systemctl restart nginx
|
|||
|
|
REMOTE
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
echo "✓ 完成!访问 http://<服务器IP>:8321"
|
|||
|
|
echo " 备案完成后:ssh 到服务器执行 sudo rm /etc/nginx/conf.d/ip-preview.conf && sudo systemctl reload nginx 即可移除"
|